ソケットはアプリケーション層とトランスポート層の間にある抽象化層で、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()