blog

ソケットがIOをブロックしている

ソケットはアプリケーション層とトランスポート層の間にある抽象化レイヤで、TCP/IP層の複雑な操作を抽象化し、アプリケーション層がネットワーク内の通信プロセスを実現するために呼び出す、いくつかのシンプ...

Dec 26, 2020 · 3 min. read
シェア

ソケットはアプリケーション層とトランスポート層の間にある抽象化層で、TCP/IP層の複雑な操作を抽象化し、アプリケーション層がネットワーク通信のプロセスを実現するために呼び出す、いくつかのシンプルなインターフェースにします。ソケットはインターフェースの集合で、デザインパターンでは、ソケットは実際にはファサードパターンで、複雑なTCP/IPプロトコルファミリーをソケットインターフェースの背後に隠します。ユーザーにとっては、ソケットが指定されたプロトコルに準拠するようにデータを整理するために必要な、シンプルなインターフェースのセットだけです。

もう1枚、実は上の写真と同じ:

DEMO

  • サーバー側
public class ServerSocketDemo {
 static ExecutorService executorService= Executors.newFixedThreadPool(20);
 public static void main(String[] args) {
 ServerSocket serverSocket=null;
 try {
 //localhost: 8080
 serverSocket=new ServerSocket(8080);
 while(true) {
 	/**
 * クライアント接続をリッスンする(コネクション・ブロッキング)
 * クライアント・リクエストが来ると、Socketオブジェクトが生成され、実行が継続される。
 /
 Socket socket = serverSocket.accept(); 
 System.out.println(socket.getPort());
 executorService.execute(new SocketThread(socket)); // 
 }
 } catch (IOException e) {
 e.printStackTrace();
 } finally {
 //TODO
 if(serverSocket!=null){
 try {
 serverSocket.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }
 }
}
public class SocketThread implements Runnable{
 private Socket socket;
 
 public SocketThread(Socket socket) {
 this.socket = socket;
 }
 @Override
 public void run() {
 try {
 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 
 String s = bufferedReader.readLine(); //がブロックされる
 String clientStr = s; //クライアントからデータ行を読み込む
 System.out.println("クライアントからメッセージを受け取る" + clientStr);
 // 
 BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
 bufferedWriter.write("というメッセージを受け取った。
");
 bufferedWriter.flush();
 bufferedReader.close();
 bufferedWriter.close();
 }catch (Exception e){
 }
 }
}
  • Server
public class SocketClientDemo { public static void main(String[] args) { try { Socket socket=new Socket("localhost",8080); Thread.sleep(50000); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bufferedWriter.write("クライアント側では、メッセージが送信される "); bufferedWriter.flush(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));// String serverLine=bufferedReader.readLine(); //サーバーから返されたデータを読む System.out.println("サーバーから返されるデータ:"+serverLine); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }

上記のケースはすべて、IOをブロックするデモです。

  • 接続ブロック serverSocket.accept()
  • IObufferedReaderのブロッキング.readLine()
Read next