之前对socket的理解一直停留在应用层次,即只是在项目中使用,而对其具体通信流程的理解是很模糊的。
现在好好的来归纳归纳这么几个问题:
1.什么是socket?
2.socket是怎样进行通信的?
3.具体到代码中,socket又如何实现?
1、什么是Socket?
socket,网上很多给的定义是“套接字”,对于我这种小白来说...what?什么鬼?更难理解好吗。
后来看到一名网友的理解,感觉颇为形象:插座,对应到服务端与客户端的关系,服务端就是个插座,客户端就是插头。
Socket本质是编程接口(API),是对TCP/IP协议的封装。
2、socket是怎样进行通信的?
Socket通信基于传输层TCP/UDP,而TCP通信需要通过三段报文完成建立连接,俗称三次握手。TCP连接建立后即可进行通信。以上是它的传输实现,而其通信工作是交给I/O的读写操作实现。
这里的I/O又分为几类:
阻塞IO 即 BIO(Blocking I/O)
非阻塞IO 即 NIO(NEW I/O)
同步IO
异步IO
这些类型之间又是可以进行组合的,如同步阻塞I/O、同步非阻塞I/O、异步阻塞I/O、异步非阻塞I/O。
3、Socket实现案例
Socket简单通信
package test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TestSocket{
class SocketServer extends Thread{
private ServerSocket serverSocket;
@Override
public void run() {
try {
serverSocket = new ServerSocket(8888);
while(true){
Socket socket = serverSocket.accept();//等待客户端请求
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输入流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//获取输出流
System.out.println("连接成功! 收到客户端消息:"+reader.readLine());
writer.write("你好");//响应客户端
writer.newLine();
writer.flush();
writer.close();
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
SocketServer server = new TestSocket().new SocketServer();//实例化服务端
server.start();//启动Socket服务端线程
Socket socket = new Socket("127.0.0.1",8888);//建立Socket客户端连接
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输入流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//获取输出流
writer.write("呼叫总部");//给服务端发送消息
writer.newLine();
writer.flush();
String answer = reader.readLine();//接收服务端消息
System.out.println("服务端响应:"+answer);
}
}
执行main方法,效果如下
以上案例为I/O类型的同步阻塞IO,其它类型的后续再进行补充。
其中需要注意的是:
代码中使用BufferedReader的readLine()方法,它是一行一行的读取。因此写完数据后需要在末尾标识换行符即“\n”,或者像代码中写入完使用newLine()方法。不然线程将一直停留在readLine()。