我目前正在学习和使用客户端/服务器,我在如何存储连接方面遇到了一些困难。
以下是一些示例代码:
while (_isRunning)
{
if (!tcpListener.Pending())
{
Thread.Sleep(200);
continue;
}
TcpClient client = tcpListener.AcceptTcpClient();
// TODO: handle connection
}
我知道我将有一个处理程序将接收/发送给给定客户端的数据但是,只是让处理程序不允许我做一些事情,比如知道有多少客户端连接,发送广播消息或关闭消息给所有
将列表中的客户端存储得很好还是应该存储其他内容?
在这种情况下,存储连接客户端的正确方法是什么?
答案 0 :(得分:1)
对于大多数常见的使用模式,保留List
连接的客户端就足够了。主要的兴趣点是决定:什么的列表?
对于许多应用程序而言,纯TCP功能使用起来不方便,因此您需要在其上面的一个层,它将流转换为更像消息队列的东西,从中可以拉出整个自包含的“消息”;这些消息的格式取决于您的应用程序。
我挖出了我的一个旧项目,这是一个客户端 - 服务器配置,其中多个客户端连接到服务器并提供远程控制功能。在该项目中,服务器将List<ConnectedClient>
保留在:
// This is the whole actual class
private class ConnectedClient
{
public TcpMessageConnection Connection { get; private set; }
public bool ConnectedEventRaised { get; set; }
public ConnectedClient(TcpMessageConnection connection)
{
this.Connection = connection;
}
}
TcpMessageConnection
看起来像:
// Only class outline shown
public class TcpMessageConnection
{
private readonly MessageStream messageStream; // another custom class
private readonly TcpClient tcpClient;
public EndPoint RemoteEndPoint { get; private set; } // who connected here?
public MessageReader MessageReader { get; } // messageStream.Reader
public MessageWriter MessageWriter { get; } // messageStream.Writer
public bool IsCurrentlyDisconnecting { get; private set; }
public void Close();
}
与MessageReader
和MessageWriter
(真正繁重的工作)一起,这足以实现在单个线程上为多个客户端提供服务的基于异步的服务器。
答案 1 :(得分:0)
对于服务器,您通常对套接字不太感兴趣,因为您使用的是套接字。我将采用的方法是拥有一个管理客户端和服务器之间对话的服务器端的类。这个类将基于一个线程,所以我的想法是每次接受连接时,你都会分离一个线程来处理对话,并且该线程是连接服务器端的套接字。
此时您将管理各种线程而不是单个套接字。这是一个更高级别的抽象,更有用。
如何管理线程取决于您想要做什么。可能你真的不想担心它。由于每个线程都做了自己的事情,当它完成时,它只是关闭它的TCP连接结束并退出。
然而,在它退出之前,线程类处理对话的服务器端。
我建议您检查此stackoverflow,Best way to accept multiple tcp clients。