我需要2个插座进行此设置还是一个?

时间:2018-11-11 19:25:51

标签: sockets

我正在实现一个小型客户端,该客户端连接到服务器以创建在线房间。

客户端在服务器端具有用于创建,加入房间等的API。对服务器的所有这些API调用都等待服务器的响应,该响应以json格式接收。

现在,在另一端,给定这些客户端中的一个,我希望收到有关另一个用户何时异步地进入与我同一个房间的通知。

我的猜测是,使用单个插槽是不可能的,而我至少需要两个:

  • 一个用于API调用的套接字(因为该套接字已经在套接字上使用读/写)用于请求和响应
  • 一个用于接收通知的套接字

我的问题是:

  1. 有没有一种方法可以以合理的方式使用单个插座? 或
  2. 在此设置中必须至少使用2个套接字吗?

2 个答案:

答案 0 :(得分:2)

只要您在客户端和服务器之间具有明确定义的消息传递协议,则只需让客户端分配一个套接字(并连接一个TCP连接)就足够了。

特别是,我怀疑您认为需要第二个TCP套接字连接,主要是因为您不确定单套接字解决方案将如何处理多种不同类型的操作(例如RPC调用异步通知),而其中一种操作不会干扰另一种功能。

在纯粹的消息传递设计中,通过单个套接字处理一切都很简单-当您的客户端要将消息发送到服务器时,它将调用您的SendMessage()函数(或您所谓的函数),您的代码会将要通过套接字发送的字节排队;相反,当服务器向您的客户端发送消息时,您的I / O代码将接收字节,如果已接收到消息的所有字节,它将对其解析并调用适当的回调函数(MessageReceived()或无论如何)对他们做出适当的反应。由于您的客户永远不会阻塞任何地方(除了在某些WaitForNextEvent()select()之类的poll()类型调用中,),集成多个同时执行的任务不是问题。

通常,我建议不要使用RPC样式的语义(即,您的客户端代码调用隐藏网络操作的函数调用,并且直到从服务器收到回复后函数调用才会返回),因为它会让您的客户端受服务器和网络连接的支配-特别是当网络临时中断时,这将导致您的客户端线程冻结(在RPC调用中阻塞),这不是一个很好的用户经验。

也就是说,如果您必须使用RPC样式的语义,则仅通过一个套接字仍然可以进行异步通知;您只需要在RPC函数中包含代码,就可以让它们在收到来自异步事件的消息时调用适当的回调函数(即SomeAsynchronousEventOccured()或您喜欢的函数)。插座。请注意,这意味着可以在RPC函数返回其网络提供的结果之前调用异步回调函数,这对于某些程序员而言可能有点令人惊讶,因此请务必记录下这种可能性。 (至少它仍然在同一个线程内被调用,因此竞争条件不会成为问题,尽管可能存在重新进入问题)

答案 1 :(得分:1)

服务器和每个客户端之间仅需要一个连接。该连接可以双向传输消息(API调用和通知)。

大多数套接字API的工作方式如下:通过创建侦听套接字来打开服务器上的端口。每个连接的客户端将成为另一个套接字。该套接字表示与该客户端的连接。您可能需要维护所有已连接客户端的列表。必须将一个套接字绑定到一个开放端口。