java帮助理解套接字连接是如何工作的



我对用java创建网络连接完全陌生,所以如果这是一个愚蠢的问题,我很抱歉。

我正在尝试创建一个D&java中的D伴侣,它将允许玩家创建他们的角色,然后将其发送给DM,以便他们可以查看并进行更改,并将其发送回玩家。我希望能够做到这一点,无论何时在一台计算机上更改字段,它也会在另一台计算机中更改。

经过一系列在线研究,我已经能够在DM(服务器)和播放器(客户端)之间创建套接字连接,并在两者之间传递消息,但我不确定在建立初始连接后套接字连接是如何工作的。我的研究对此并不十分清楚。我发现很多资源都说java在消息传递后关闭套接字,还有很多资源说套接字保持打开状态。

如果java关闭了套接字,那么我的问题就很容易解决了,因为每次我需要传递数据时,我都必须打开一个新的套接字,确保我在第一次连接时将客户端的IP地址传递给服务器。

当插座一直开着的时候,我真正的问题就来了。

如果套接字保持打开,并且多个客户端连接到服务器,那么每当服务器发送消息时,它会在网络上大喊,以便所有客户端都接收到消息吗?(如果是这种情况,那么我知道我可以在消息的前面附加一个用户名,这样客户端就可以确定服务器是否在与它交谈。)

如果服务器没有喊叫,那么我如何指定我希望服务器与哪个客户端对话?

我是否必须在我的接收方法中添加一个循环,以便客户端/服务器不断侦听来自服务器/客户端的传输,或者在我第一次运行该方法后,java会自动这样做?

我发现许多资源都说java在消息传递后关闭套接字

你在哪里找到的?

和许多人说套接字保持打开状态。

所有这些都是正确的。Java从不关闭连接。应用程序关闭连接。

如果java关闭了套接字,那么我的问题就很容易解决了,因为每次我需要传递数据时,我都必须打开一个新的套接字,确保我在第一次连接时将客户端的IP地址传递给服务器。

没有。

当套接字保持打开时,我真正的问题就来了。

如果套接字保持打开,并且多个客户端连接到服务器,那么每当服务器发送消息时,它会在网络上大喊,以便所有客户端都接收到消息吗?

否。它将通过连接到相应客户端的套接字进行响应。

(如果是这种情况,那么我知道我可以在消息的前面附加一个用户名,这样客户端就可以确定服务器是否在与它通信。)

不必要。

如果服务器没有喊叫,那么我如何指定我希望服务器与哪个客户端通话?

服务器通过读取请求的同一套接字进行响应。

我是否必须在接收方法中添加一个循环,以便客户端/服务器不断侦听来自服务器/客户端的传输

不,您必须为每个接受的套接字添加一个线程,该线程循环读取请求,直到流结束。

还是在我第一次运行该方法后java会自动这么做?

否。

你似乎一直在读一些骇人听闻的胡言乱语。看看Java教程的"自定义网络"部分。

添加到EJP的明智答案中,可能值得澄清:

  1. 听起来你(明智地)使用了TCP,所以你的套接字代表了一个服务器和一个客户端之间的连接。否";大喊";。在这样的例子中,当建立连接时(即,客户端通过调用"新套接字"获得套接字,服务器通过调用"接受"获得套接字),这些套接字专用于这2个特定端点。因此,如果10个客户端连接到1台服务器,服务器将保留10个套接字,并且不会混淆它们。有点像一个可怜的秘书,他的桌子上有10部电话,而且都接——尽管一团糟,但每个耳机都清楚地连接到一个客户
  2. 连接可以保持一段时间&提供多条信息。当其中一方调用"socket.close"时,它将终止,或者它可以由底层第三方(操作系统、代理、防火墙)终止。对于您的第一个版本,或者对于简单的业务需求,通过这1个简单的连接进行对话可能就足够了。然而,对于需要"交付保证"的商业关键数据,您可能需要投入一些仔细的思考和精力;可能是RabbitMQ等工具

祝你好运:)

最新更新