JavaでSocket通信をおこなう。サーバとクライアントのサンプルコード。

javaソケット

Javaでソケット通信を、自前で開発しなければいけない事はあるかと思います。
ソケットを待ち受ける側が常駐プロセスとして確立させ、ソケットの送信を常に待ち受けている状態。
ソケットを待ち受ける側がサーバとなり、ソケットを送る側がクライアント側になりますね。


今回は、ソケット通信のサーバ側とクライアント側のサンプルソースコードを紹介いたします。
ソケットの送受信のみのサンプルコードになりますので、システム固有の処理については別途組み込んで使ってください。


環境情報


今回のサンプルコードのビルド環境、実行環境は以下になります。


  • Java12.0.1

Javaの標準ライブラリしか使っていないです。
Apache等の拡張ライブラリ(JAR)は必要なし、になります。


サンプルプログラムの機能


サーバのクラス名は「SocketReceive」
クライアントのクラス名は「SocketSend」


クライアントは、クライアント上に存在するファイルである「client_send.txt」をストリーム上に読み込みます。
クライアントの「SocketSend」は、サーバの「SocketReceive」に接続して「client_send.txt」の内容を送信します。
「SocketReceive」は受信した内容を「server_recv.txt」にファイル出力します。


「SocketReceive」は、ファイル出力が終わった後にまったく逆のことをおこないます。
「SocketReceive」は、「server_send.txt」をストリーム上に読み込み「SocketSend」に送信します。
「SocketSend」は受信した内容を「cient_rect.txt」に出力します。


送受信プログラムの概要

ソケット通信プログラム

クライアントプログラム – ソケット送信


クライアントプログラム(送信側)のサンプルは以下になります。
上の説明での「SocketSend」になります。


import java.sql.SQLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class SocketSend {

    private SocketSend() {
    }

    public static void main(String[] args) {

        Socket socket = null;
        FileOutputStream fos = null;
        FileInputStream fis = null;
        try {
            System.out.println("start.");

            // 出力ソケットを作成
            socket = new Socket("localhost", 8100);

            // 入出力ストリームを準備
            fis = new FileInputStream("client_send.txt");
            fos = new FileOutputStream("client_recv.txt");

            // 入力ストリームの内容を全て送信
            int ch;
            OutputStream output = socket.getOutputStream();
            while ((ch = fis.read()) != -1) {
                output.write(ch);
            }
            output.write(0);

            // サーバからのレスポンスを受信し、ファイルに出力
            InputStream input = socket.getInputStream();
            while ((ch = input.read()) != -1) {
                fos.write(ch);
            }
        } catch (SocketException e) {
            System.out.println("occured SocketException.");
        } catch (Exception e) {
            System.out.println("occured Exception.");
        } finally {
            try {
                socket.close();
                fos.close();
                fis.close();
            } catch (IOException e) {
                System.out.println("occured IOException.");
            }
            System.out.println("end.");
        }
    }
}

サーバプログラム – ソケット受信


次はサーバプログラム(受信側)のサンプルです。
上の説明での「SocketReceive」になります。


import java.sql.SQLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class SocketReceive {

    private SocketReceive() {
    }

    public static void main(String[] args) {

        Socket socket = null;
        FileOutputStream fos = null;
        FileInputStream fis = null;
        try {
            System.out.println("start.");

            // 入出力ストリームを準備する
            fos = new FileOutputStream("server_recv.txt");
            fis = new FileInputStream("server_send.txt");

            // 入力ソケットを作成して、送信を待ち受ける
            ServerSocket server = new ServerSocket(8100);
            socket = server.accept();

            // ソケットを受信する
            int ch;
            InputStream input = socket.getInputStream();
            while ((ch = input.read()) != 0) {
                fos.write(ch);
            }

            // 受信した内容をファイル出力
            OutputStream output = socket.getOutputStream();
            while ((ch = fis.read()) != -1) {
                output.write(ch);
            }
        } catch (SocketException e) {
            System.out.println("occured SocketException.");
        } catch (IOException e) {
            System.out.println("occured IOException.");
        } catch (Exception e) {
            System.out.println("occured Exception.");
        } finally {
            try {
                socket.close();
                fos.close();
                fis.close();
            } catch (IOException e) {
                System.out.println("occured IOException.");
            }
            System.out.println("end.");
        }
    }
}

まとめ


いかがでしたでしょうか?
ソケット通信の仕組みを開発する必要が出てきた場合は参考にしてください。


ちょっとできなかったのは、「SocketReceive」の常駐プロセス化。
現在のサンプルプログラムは1回受信したら終わってしまうので。


ここら辺はアレンジして使ってください。


それではまた!