为何通过ServerSocket的accept()方法无需new即可创建Socket对象?
Java Socket中ServerSocket.accept()返回Socket对象的原理
你碰到的两种Socket创建方式,对应TCP通信里客户端主动发起连接和服务器被动接收连接两个完全不同的场景:
- 客户端侧:
Socket s = new Socket(StringIP, intPort);是你主动触发TCP连接流程,必须指定目标服务器的IP和端口,所以需要显式用new创建Socket对象来发起请求。 - 服务器侧:
ServerSocket myServer = new ServerSocket(portNum); Socket socket = myServer.accept();里的accept()方法并不是不用new,而是**new Socket()的过程被JDK底层封装在方法内部实现里了**。
- 客户端侧:
具体逻辑是:ServerSocket的核心工作是绑定端口、监听客户端的连接请求。当调用
accept()时,方法会阻塞等待,直到有客户端发起TCP握手并完成连接。此时JDK底层会依赖操作系统的Socket API自动创建一个Socket实例——这个实例已经和客户端建立好通信链路,包含了读写数据所需的流、连接状态等信息,最后直接把这个实例返回给你,所以你不用自己显式写new Socket()。打个简单的比方:你开了家店(ServerSocket绑定端口),蹲在门口等客人(
accept()阻塞),客人上门(客户端发起连接)后,你不用自己凭空造一个客人,直接把上门的这个客人(底层生成的Socket对象)领进来服务就行。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

