===什么是 Socket ?
Socket传输模式: 1. 面向连接 2. 无连接(还没研究,这里不提了)
面向连接使用TCP协议, 这个模式下Socket必须在发送数据之前与目的地Socket取得连接。
建立连接后,既可使用流接口 进行对于的打开,读,写,关闭操作。并且发送数据的顺序,
与接收的顺序保持一致。
见下图:
===Socket构造
在包java.net中提供了两个类:Socket,ServerSocket分别表示双向连接的客户端和服务端。
新建ServerSocket对象,并绑定监听端口
(如上图TCP服务器端0-2步)
void setupServerSocket() throws IOException { serverSocket = new ServerSocket(); serverSocket.setReuseAddress(true); // 监听的端口 范围 [1024,65535) serverSocket.bind(new InetSocketAddress(port)); }
阻塞等待客户端发起连接(accept)
// 阻塞程序 等待客户端连接 Socket cmdClientSocket = serverSocket.accept(); // 新起线程去处理cmdClientSocket发来的请求 // 因为服务端对应客户端可能是 1:0~n SessionThreadThread newSession = new SessionThreadThread( cmdClientSocket); newSession.start(); // 将线程注册到统一地点 便于管理 // 这里使用的List管理这些线程 ftpServerService.registerSessionThread(newSession);
读取客户端传来的数据(read)
BufferedReader in = new BufferedReader(new InputStreamReader( cmdClientSocket.getInputStream()), 8192); // use 8k buffer while (true) { String line = null; line = in.readLine(); if (line != null) { // TODO: } else { break; } }
服务端写操作传回客户端(write)
BufferedOutputStream out = new BufferedOutputStream( cmdClientSocket.getOutputStream(), Defaults.dataChunkSize); out.write(bytes); out.flush();
关闭操作(close)
serverSocket.close(); cmdClientSocket.close();
综上ServerSocket会阻塞自身,直接accept()方法得到一个clientSocket,然后操作clientSocket,与客户端的Socket进行通讯。这点在上图中能很好的体现。附上: Wifi下 Android(客户端)与PC(服务端)通信