好吧,所以这是我的想法:
如果同时向一个服务器发出两个请求,是否会被拒绝,如果是,那么你怎么能保留这样的东西呢?
我目前为我正在制作的聊天应用程序设置了服务器,它基本上启动了TCP / IP连接,等待客户端,读取从它们发送的数据,发回一些东西,断开连接和重复。这样,服务器永远不会停止运行,并且可以生成任意数量的请求。
但是,如果客户端在另一个程序正在使用服务器时启动,该怎么办?如果一个程序从服务器获取文件而另一个程序正在启动,并且启动时需要来自服务器的数据,但它已经很忙,会发生什么?
启动会等到服务器可用,还是直接发生错误(因为没有可用的连接)。如果是这样,这可能非常糟糕,因为用户不会拥有所有数据,例如他的朋友列表,或者几个聊天。你怎么能解决这个问题?
我的想法是你可以设置一个while
循环,以便它一直排队服务器,直到它得到响应。这是正确的方法吗?
不,客户端应该假设服务器始终可用。您将看到基本的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
参数确定可以在积压一下子。
如果积压完全填满怎么办?此时,您需要第二台服务器和负载均衡器作为中间人,将一半请求指向第一台服务器,将一半请求指向第二台服务器。
这里的逻辑很简单。