Java Socket通信の簡単なサンプル

標準キー入力による簡単なサンプル

受信サーバーソケットプログラム
同時複数接続を可能とするために、accept() で接続した Socket は、子スレッドで close する。

import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * ReceiverMain
 */
public class ReceiverMain{
    public static void main(String[] args){
        Logger logger = LoggerFactory.getLogger(ReceiverMain.class);
        logger.info("■ 開始");
        try(ServerSocket server = new ServerSocket()){
            server.bind(new InetSocketAddress("localhost", 8091));
            while(true){
                Socket sc = server.accept();
                logger.info("■ 接続 "+sc.getInetAddress().getHostAddress()
                        +" : "+sc.getPort() + " : "+sc.getLocalPort() );
                new Thread(()->{
                    ReceiveProcess process = new ReceiveProcess();
                    process.execute(sc);
                }).start();
            }
        }catch(Exception e){
            logger.error(e.getMessage(), e);
        }finally{
            logger.info("■ 終了");
        }
    }
}

接続した Socket の受信スレッドとして処理する。
"exit" を受信したら終了

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * ReceiveProcess
 */
public class ReceiveProcess{
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    public void execute(Socket sc) {
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(sc.getInputStream()));
              PrintWriter writer = new PrintWriter(sc.getOutputStream(), true)){
            String line = null;
            while(true){
                line = reader.readLine();
                logger.info("■ 受信=" + line);
                writer.println("OK");
                if (line.equals("exit")) {
                    break;
                }
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                sc.close();
            }catch(IOException e){
                logger.error(e.getMessage(), e);
            }
            logger.info("■切断");
        }
    }
}

クライアント側のプログラム
標準キー入力を送信する。"exit" を送信したら終了

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
 * SendMain
 */
public class SendMain{

    public static void main(String[] args){
        try(Scanner scan = new Scanner(System.in)){
            try(Socket socket = new Socket("localhost", 8091);
                PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))
            ){
                    System.out.println("# "+socket.getInetAddress().getHostAddress()
                                                + " : port="+socket.getPort()
                                                + " : Local port="+socket.getLocalPort());
                    while(true){
                        System.out.print("--->");
                        String input = scan.nextLine();
                        writer.println(input);

                        System.out.println("response : " + reader.readLine());
                        if (input.equals("exit")) {
                            break;
                        }
                    }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

writer ではなく、OutputStream のまま使う場合は、flush() ではなくclose() で送信されるので
1回の接続で1回の送信しかできない