如何与服务器同时处理多个请求

时间:2018-06-14 19:01:44

标签: c# loops tcp client-server

好的,所以这是我的想法:

  

如果同时向一个服务器发出两个请求,是否会被拒绝,如果是,那么你怎么能保持这样的事情呢?

我目前正在为我正在制作的聊天应用程序设置服务器,它基本上启动TCP / IP连接,等待客户端,读取从它们发送的数据,发回一些东西,断开连接并重复。这样,服务器永远不会停止运行,并且可以根据需要进行多次请求。

但是,如果客户端正在启动而另一个程序正在使用该服务器,该怎么办?如果一个程序从服务器获取文件而另一个程序正在启动,并且启动时需要来自服务器的数据,但它已经很忙,会发生什么?

启动程序是否会等到服务器可用,或者只是直接发生错误(因为没有可用的连接)。如果是这样,这可能非常糟糕,因为用户不会拥有所有数据,例如他的朋友列表,或者几个聊天。你怎么能解决这个问题?

我的想法是你可以设置一个while循环,以便它一直排队服务器,直到它得到响应。这是解决这个问题的正确方法吗?

2 个答案:

答案 0 :(得分:0)

不,客户端应该假设服务器始终可用。您会发现基本的Socket.Listen(int32)方法(TcpListener充当其包装)需要一个参数backlog

  

Listen会导致面向连接的Socket侦听传入的连接尝试。 backlog参数指定可以排队等待接受的传入连接数。要确定可以指定的最大连接数,请检索MaxConnections值。听不会阻止。

大多数服务器实现都是从以下内容开始的:

socket.Listen(10); // You choose the number
while (true)
{
    var client = socket.Accept();
    // Spawn a thread (or Task if you prefer), and have that do all the work for the client
    var thread = new Thread(() => DoStuff(client));
    thread.Start();
}

通过此实现,始终有一个线程正在侦听新连接。当客户端连接时,会为其创建一个新线程,因此该客户端的处理不会延迟/阻止在主线程上接受更多连接。

现在,如果一些新连接比服务器创建新线程的速度快,那么新连接将自动放入积压(我认为在操作系统级别) - backlog参数确定如何许多待处理的连接可以一次存在于待办事项中。

如果积压完全填满怎么办?此时,您需要第二台服务器和负载均衡器作为中间人,将一半请求指向第一台服务器,将一半请求指向第二台服务器。

答案 1 :(得分:0)

这里的逻辑很简单。

  1. 服务器开始侦听并开始接受客户端。

  2. 客户端尝试连接到服务器。如果服务器没有运行,您可以简单地执行任何操作,或者您可以实现一些重新连接逻辑,通知客户端连接尝试失败。

  3. 让我们假设客户端尝试连接时服务器正在运行。您正在谈论多客户端应用程序。您不应该断开客户端。您应该将已连接的客户端添加到已连接客户端列表中。

  4. 然后,当某些客户端连接到服务器并且还有一些其他已连接的客户端并发送一些消息时。您通过客户端套接字接收该消息,然后将消息广播到除发送数据之外的所有其他连接客户端。