我需要两个插座来进行此设置吗?还是一个就可以了



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

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

现在,在另一方面,给定其中一个客户端,我希望异步接收另一个用户何时加入与我相同的房间的通知。

我的猜测是,这不可能用一个单独的插座,我将需要至少两个:

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

我的问题是:

  1. 有没有一种方法可以用一个合理的方式来实现这一点?或
  2. 在此设置中必须至少使用2个套接字

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

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

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

一般来说,我建议不要使用RPC风格的语义(即,客户端代码调用隐藏网络操作的函数调用,而函数调用在从服务器收到回复之前不会返回(,因为这会让客户端任由服务器和网络连接的支配——特别是,无论何时,它都会导致客户端线程冻结(在RPC调用中被阻止(有一个暂时的网络中断,这不是一个很好的用户体验。

也就是说,如果必须使用RPC风格的语义,那么异步通知仍然可以只使用一个套接字;您只需要在RPC函数中包含代码,使它们能够在接收到来自套接字的异步事件发生消息时调用适当的回调函数(即SomeAsynchronousEventOccured()或您喜欢调用的任何函数(。请注意,这意味着异步回调函数可以在RPC函数返回其网络提供的结果之前被调用,这可能会让一些程序员感到有点惊讶,所以一定要记录这是可能的。(至少它仍然在同一个线程中被调用,所以竞争条件不会成为问题,尽管重新进入的问题可能是(

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

大多数套接字API都是这样工作的:通过创建一个侦听套接字来打开服务器上的端口。每个连接的客户端都成为另一个套接字。该套接字表示到该客户端的连接。很可能,您需要维护一个所有连接客户端的列表。需要有一个单独的套接字绑定到一个开放端口。

相关内容

最新更新