1(实战):Socket 网络通信实战(文末有项目连接)

什么是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包
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容