【问题标题】:Socket instead of a ServerSocketSocket 而不是 ServerSocket
【发布时间】:2012-09-19 12:03:13
【问题描述】:

虽然 ServerSocket 类被设计为一般地监听传入的连接,但我可以只使用 Socket 对象并在 java 中检索传入的数据吗?如果是,那么我是否需要采取任何额外的预防措施?

编辑:感谢您的回答...但尽管在 UDP 中只有一个套接字类——DatagramSocket 对吗?

【问题讨论】:

  • 为什么要避免使用 ServerSocket?
  • 只是好奇,抱歉。这已经刺痛了我很长一段时间:)

标签: java sockets serversocket


【解决方案1】:

ServerSocket 用于绑定()和接受()到本地端口。尽管有这个名字,ServerSocket 不是Socket,它只用于接收连接。完成后,您会通过接受传入请求获得Socket,这是一个通信管道。我不相信你可以使用Socket 来接收传入的请求,而不使用某种连接接收器,比如ServerSocket

【讨论】:

  • 除了 ServerSocket.accept() 之外,我没有其他方法可以用来接收传入的请求?
  • 对于 TCP/IP,我不这么认为。你可以继承它,但最重要的是它总是依赖于 ServerSocket 接受机制。
  • 但是虽然在 UDP 中只有一个套接字类——DatagramSocket 对吧?
  • UDP 是无连接的,因此没有 Socket 等效项。 DatagramSocket 类似于 TCP/IP 中的 ServerSocket
  • 据我所知,一个 IPAddress 和一个端口号。是一个套接字(通常而不是从 java 类的角度来看)。那么是不是说DatagramSocket就相当于一个既能收发数据又能收发数据的socket呢?
【解决方案2】:

Socket 无法接收传入的连接:只有 ServerSocket 可以这样做。

【讨论】:

    【解决方案3】:

    当使用套接字时,一端必须伸出并连接到另一端(并且另一端必须监听该连接)。伸出的一端通常称为客户。正在侦听的一端称为服务器。

    一个 ServerSocket 代表那个监听行为。一旦你的 ServerSocket 接收到一个连接,它就会创建一个 Socket。所以你实际上需要同时使用两者。服务器首先设置一个 ServerSocket,然后使用 accept() 等待连接。一旦连接到达,这将创建一个 Socket。

    在某些应用程序中,服务器一直在等待更多连接,而在其他应用程序中,您可以在此时停用 ServerSocket,而只需担心 Socket。

    不幸的是,您不能在双方都有客户端(除非您有第三台服务器,两者都在连接),因为必须有人在监听连接。

    【讨论】: