【问题标题】:Use Socket permantently to handle Clientsession or create new one for every request永久使用 Socket 来处理 Clientsession 或为每个请求创建一个新的
【发布时间】:2019-06-01 16:40:27
【问题描述】:

所以我对 Sockets 很陌生,我必须为学校创建一个 Server-Client-App。

我希望客户端在其运行时多次向服务器请求某些内容。

我不确定是否应该为我收到的每个请求创建一个新的 java.net.Socket(客户端每次都会打开新的套接字并且 Java Serversocket 接受) 或使用单个套接字并在客户端运行时保留它。

【问题讨论】:

  • 正常的做法是让socket一直打开直到你用完,然后再关闭。

标签: java sockets serversocket


【解决方案1】:

这在很大程度上取决于套接字的使用频率。 例如。如果您知道客户端将每 50 毫秒向服务器发送一次请求,那么保持套接字打开会更容易。 但是,如果您知道客户端只会每 5 分钟从套接字请求一次信息,那么最好关闭连接并在需要时创建一个新连接。如果您不知道何时创建下一个请求,也一样。

在服务器端创建一个新的 Socket 并不是很昂贵,所以如果不经常使用,最好关闭连接。 一个例外可能是一个特殊的套接字,它需要身份验证或其他昂贵的东西来创建,但在学校项目中可能不是这种情况。

所以一般来说:这取决于套接字的使用情况,但如果您不确定它是否经常使用,最好关闭它并在需要时再次打开它。

【讨论】:

    【解决方案2】:

    与这个问题有关:

    Maximum number of socket in java

    如果您担心超过可以打开的最大套接字数(我想这在您的情况下极不可能),您可以创建一个解决方法,在其中使用 TCP 最初建立连接,发送客户端一个 UID(唯一标识符,一个 64 位的unsigned long long 类型就足够了),然后关闭 TCP 连接。填写并维护一个结构(或您的情况下的 Class 对象)详细说明连接详细信息(IP 地址,唯一标识符代码),然后等待通过 UDP(用户数据报协议,TCP 的替代方案)发送的到达数据包。如果您决定使用 UDP,请注意您需要实现一种重新排序数据包的方法以重建字节流(序列化)和一种在数据包以某种方式未到达时重新发送数据包的机制(数据包丢失恢复) .

    听起来比实际更糟。不过我会重复一遍,如果您不担心超出任何限制,请不要为这些错综复杂的事情烦恼。

    【讨论】:

      猜你喜欢
      • 2017-01-18
      • 2016-08-07
      • 2011-05-15
      • 1970-01-01
      • 2014-02-04
      • 2018-09-16
      • 2013-02-08
      • 2020-07-22
      • 2015-09-25
      相关资源
      最近更新 更多