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

时间:2017-11-13 01:26:49

标签: java sockets networking

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

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

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

如果java关闭套接字然后我的问题很容易解决,因为每次我需要传递数据时我只需要打开一个新的套接字,确保我第一次将客户端的IP地址传递给服务器我建立联系的时间。

当套接字保持打开状态时,我会遇到真正的问题。

如果套接字保持打开状态且多个客户端连接到服务器,那么只要服务器发送消息,服务器就会通过网络大喊一声,以便所有客户端都能收到消息? (如果是这种情况,那么我知道我可以在消息的前面附加一个用户名,以便客户端可以确定服务器是否正在与之通话。)

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

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

2 个答案:

答案 0 :(得分:1)

  

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

你找到了他们的位置?

  

许多人说插座保持打开状态。

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

  

如果java关闭套接字然后我的问题很容易解决,因为每次我需要传递数据时我只需要打开一个新的套接字,确保我第一次将客户端的IP地址传递给服务器我建立联系的时间。

没有。

  

当套接字保持打开状态时,我会遇到真正的问题。

     

如果套接字保持打开状态且多个客户端连接到服务器,那么只要服务器发送消息以便所有客户端都收到消息,服务器是否会通过网络大喊一声?

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

  

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

不必要的。

  

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

服务器通过同一个套接字响应它从中读取请求。

  

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

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

  

或者我第一次运行该方法后会自动执行此操作吗?

没有

你似乎一直在阅读一些真正令人震惊的传闻。请查看Java Tutorial的Custom Networking部分。

答案 1 :(得分:0)

加入EJP的明智答案,可能值得澄清一下:

  1. 听起来像你(明智地)使用TCP,所以你的Socket表示1个服务器和1个客户端之间的连接。没有“喊叫”。 In examples such as this,当建立连接时(即,客户端通过调用“new Socket”获得Socket并且服务器通过调用“accept”获得Socket),那些套接字专用于那两个特定端点。因此,如果10个客户端连接到1个服务器,则服务器将保留10个套接字并且不会混淆它们。有点像一个可怜的秘书,他的桌子上有10个电话并且全部回答 - 尽管一团糟,每个耳机显然都与1个客户相连。
  2. 连接可以保持一段时间&提供几条消息。当其中一方调用'socket.close'时,它将终止,或者它可以由底层第三方(操作系统,代理,防火墙)终止。 对于您的第一个版本,或者对于简单的业务要求,它可能足以通过这个简单的连接进行交谈。但是,对于需要“交付保证”的商业关键数据,您可能需要仔细考虑并投入可能是RabbitMQ等工具。
  3. 祝你好运:)