C# 套接字服务器设计建议

C# 套接字服务器设计建议,c#,sockets,winsock,C#,Sockets,Winsock,我们正在用c#编写一个套接字服务器,需要一些关于设计的建议 背景:客户端(来自移动设备)连接到我们的服务器应用程序,我们保持它们的套接字打开,以便我们可以在需要时向它们发送数据。数据量各不相同,但我们通常每隔几秒钟从每个客户机发送/接收数据,因此数据量相当大。同时连接的数量可以在50-500之间(将来还会更多) 我们已经使用异步套接字编写了一个服务器应用程序,它可以正常工作,但是我们遇到了一些障碍,我们需要确保我们所做的是正确的 我们有一个保存客户端状态的集合(我们现在没有套接字/连接池,是吗?

我们正在用c#编写一个套接字服务器,需要一些关于设计的建议

背景:客户端(来自移动设备)连接到我们的服务器应用程序,我们保持它们的套接字打开,以便我们可以在需要时向它们发送数据。数据量各不相同,但我们通常每隔几秒钟从每个客户机发送/接收数据,因此数据量相当大。同时连接的数量可以在50-500之间(将来还会更多)

我们已经使用异步套接字编写了一个服务器应用程序,它可以正常工作,但是我们遇到了一些障碍,我们需要确保我们所做的是正确的

我们有一个保存客户端状态的集合(我们现在没有套接字/连接池,是吗?)

每次客户端连接时,我们都会创建一个套接字,然后等待它们向我们发送一些数据,在receiveCallBack中,我们会将它们的clientstate对象添加到我们的连接字典中(一旦我们验证了它们是谁)

当客户机对象注销时,我们关闭它们的套接字,然后关闭它,并将它们从我们的客户机集合字典中删除

想必一切都按正确的顺序发生,一切都按预期进行

然而,几乎每天它都停止接受连接,或者我们这样认为,要么它连接了,要么它连接了,但实际上没有做任何事情,我们无法理解为什么它只是停止

我们几乎没有什么不确定的事情

1) 我们是否应该创建某种连接池,而不仅仅是一个客户端套接字字典

2) 连接的套接字会发生什么情况,但不会添加到我们的字典中,它们只是在内存中徘徊,什么也不做,我们是否应该在创建套接字后立即创建另一个保存套接字的字典

3) 如果客户端不再连接,最好的方法是什么?我们已经阅读了许多方法,但我们不确定哪种方法是最好的,发送数据还是读取数据,如果是,如何使用

4) 如果我们在连接中循环检查已处理的客户端,我们应该锁定字典吗?如果是,这会如何影响同时尝试使用它的其他客户端对象,它会抛出错误还是只是等待

5) 我们经常在ReceiveCallBack方法中随机获得disposedSocketException,这是否意味着我们可以安全地从集合中删除该套接字

我们似乎找不到任何生产类型的例子来说明这一点

任何建议都会被大量接受是的,锁定它。其他线程只需等待

通常,您必须在每次访问(包括读取)时锁定字典。否则,结构可能会损坏,这可能是您出现问题的原因之一。

Daryn Kiely的一篇文章回答了您的几个问题。它提供了一些良好的背景以及客户机和服务器实现的示例