標準キー入力による簡単なサンプル
受信サーバーソケットプログラム
同時複数接続を可能とするために、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回の送信しかできない