首页 文章

Java在使用端口时Socket和ServerSocket的区别

提问于
浏览
4

在服务器端,我们使用

Socket server = serverSocket.accept();

创建一个套接字 . 创建套接字后,我们可以创建一个新线程来处理该套接字的输入/输出流 . 因此,如果有进一步的连接请求,我们可以回到同一端口监听并创建新套接字 . 由于我们已经在特定端口创建了ServerSocket,当然我们无法再在该端口创建另一个ServerSocket .

所以根据我的理解,我可以得出结论,在服务器端,我们可以在一个端口下创建多个套接字吗? (类似于Web服务器的功能)

实际上我的问题是,在客户端,当我们创建套接字时,我们可以指定我们想要使用的本地端口 . 在我们成功在该本地端口创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?在套接字关闭(或端口关闭)之前,该端口是否会永久绑定到套接字?由于客户端没有“Listening”概念,我们是否能够像ServerSocket那样做(参考ServerSocket可以在一个端口下创建多个套接字)?

我很困惑客户端如何处理端口和套接字,因为我正在比较ServerSocket和客户端套接字 .

请指出正确的方向,我知道我的想法有些不对劲 . 非常感谢 .

3 回答

  • 1

    您应该将套接字想象为两对信息数组:

    • {Self Port,Self Addr}

    • {Dest Port,Dest Addr}

    因此,单个服务器可能有许多连接到它的{Dest Port,Dest Addr}

    example: Server port 10000 addr 10.0.0.1
    
    Socket 1:
    
     - {10000,10.0.0.1}
     - {10001,10.0.0.2}
    
    Socket 2:
    
     - {10000,10.0.0.1}
     - {10002,10.0.0.1} - address may seem the same but as a whole its a
       different destination
    

    希望这可以帮助 .

  • 3

    因此,根据我的理解,我可以得出结论,在服务器端,我们可以在一个端口下创建多个套接字吗? (类似于Web服务器的功能)

    你的术语令人困惑 . ServerSocket.accept() 接受连接,并将 endpoints 包装在 Socket 中 . endpoints 具有与 ServerSocket 相同的本地端口号,根据RFC 793定义,因此包装 Socket 也是如此 .

    实际上我的问题是,在客户端,当我们创建套接字时,我们可以指定我们想要使用的本地端口 .

    我们可以,但我们很少这样做 .

    在我们成功在该本地端口创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?

    没有 .

    该端口是否会永久绑定到套接字,直到套接字关闭(或端口关闭)?

    是的,或者反过来说:套接字绑定到端口 .

    由于客户端没有“Listening”概念,我们是否可以像ServerSocket那样做(参考ServerSocket可以在一个端口下创建多个socket)?

    没有 .

  • 3

    ServerSocket 可以简单地视为传入连接的 Socket 工厂 . 对于每个传入的客户端连接, ServerSocket.accept() 方法返回一个新的 Socket 以与之通信,并且仅与该客户端进行通信 .

    换句话说,可以对单个 ServerSocket 进行任意数量的连接(仅受OS限制),并且每个客户端连接将获得单独的 Socket 进行通信,所有连接都使用相同的服务器端TCP端口进行通信 .

相关问题