什么是Socket(套字节):
Socket是一个抽象概念,应用程序可以通过它发送或接收数据。
在使用 Socket 进行网络通信的时候,通过 Socket 就可以让我们的数据在网络中传输。
套接字是IP地址与端口的组合,套接字 Socket=(IP地址:端口号)。
Socket 网络通信图:

Socket 网络通信图流程图.png
流程
1:建立服务端并且监听客户端请求
2:客户端请求,服务端和客户端建立
3:连接两端之间可以传递数据
4:关闭资源
服务器端:
1:创建 ServerSocket 对象并且绑定地址(ip)和端口号(port):server.bind(new InetSocketAddress(host, port))
2:通过 accept()方法监听客户端请求
3:连接建立后,通过输入流读取客户端发送的请求信息
4:通过输出流向客户端发送响应信息
5:关闭相关资源
客户端:
1:创建Socket 对象并且连接指定的服务器的地址(ip)和端口号(port):socket.connect(inetSocketAddress)
2:连接建立后,通过输出流向服务器端发送请求信息
3:通过输入流获取服务器响应的信息
4:关闭相关资源
//流程 核心代码
InputStream read; 读取进来的信息
OutputStream wirte; 编写返回的信息
服务端:
// 1:创建服务端 并 监听客户端
ServerSocket server = new ServerSocket(port);
// 2:从客户端 获取socket
socket = server.accept()
// 3:从客户端的socket获取 输入 输出流
ObjectInputStream objectInputStream
= new ObjectInputStream(socket.getInputStream()
ObjectOutputStream objectOutputStream
= new ObjectOutputStream(socket.getOutputStream()
//4:获取客户端发送过来的信息 或者 返回给客户端信息
String requestMessage = (Stirng) objectInputStream.readObject();
String responseMessage = ""
objectOutputStream.writeObject(message);
客户端:
// 1:创建客户端socket
Socket socket = new Socket(host, port))
// 2:客户端socket获取 输入 输出流
ObjectOutputStream objectOutputStream
= new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream
= new ObjectInputStream(socket.getInputStream());
// 3:发送给服务端的信息 或者 获取服务端返回的信息
String requestMessage = ""
objectOutputStream.writeObject(requestMessage);
String responseMessage = objectInputStream.readObject();
//线程核心代码
//创建线程池
ThreadFactory threadFactory = Executors.defaultThreadFactory();
ExecutorService threadPool
= new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES,
new ArrayBlockingQueue<>(100), threadFactory);
threadPool.execute(() -> {
// 创建 socket 连接
});
Socket的缺点
1:ServerSocket 的 accept()方法是阻塞方法(等待客户端的连接请求时会阻塞),直到收到客户端发送的连接请求才会继续往下执行代码;
2:服务端只能同时处理一个客户端的连接,如果需要管理多个客户端的话,需要为请求的客户端单独创建一个线程。(可以用多线程 或者 线程池解决)
但不管怎么优化和改变。也改变不了它的底层仍然是同步阻塞的BIO模型的事实,因此无法从根本上解决问题。

Socket服务端模式.png
解决方案:
1:Java 1.4 中引入了 NIO ,一种同步非阻塞的 I/O 模型
2:使用基于 NIO 的网络编程框架 Netty;
(由于使用同步非阻塞的I/O模型 NIO 来进行网络编程真的太麻烦了。)
项目连接
请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/rpc-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/rpc-project.git
rpc-project-demo模块下 socketDemo包