【问题标题】:TcpListener How to get Connected Clients?TcpListener 如何获取已连接的客户端?
【发布时间】:2016-05-08 10:42:31
【问题描述】:

我有一个连接到多个客户端的 TcpListener。我可以获得所有已连接客户端的列表吗?

【问题讨论】:

  • @BewareSalah 您可以在接受TcpClients 时手动将其保留在列表中。

标签: c# tcplistener


【解决方案1】:

我认为最好的方法是在打开连接时将客户端添加到列表中:

public TcpClient connectedClients = new list<TcpClient>();

public void ConnectClient(int ip, int port)
{
    tcp.Connect(ip, port);
    connectedClients.Add(tcp);
}

如果您断开其中一个客户端:

public void DisconnectClient(int ip, int port)
{
    tcp.Close();
    connectedClients.RemoveRange(0, connectedClients.Length)
}

因为当你关闭一个 TcpClient 时,所有的连接都被断开了,你还不如清空这个列表。

希望这会有所帮助。

【讨论】:

  • 如果一个客户端断开连接怎么办?如何将其从列表中删除?
【解决方案2】:

当您接受服务器上的连接时,您可以将客户端放入列表中。

TcpListener server = new TcpListener(port);
server = new TcpListener(localAddr, port);

// Start listening for client requests.
server.Start();

List<TcpClient> listConnectedClients =  new List<TcpClient>();
while(true)
{
    TcpClient client = server.AcceptTcpClient();
    listConnectedClients.Add(client);
}

【讨论】:

  • 我认为这是唯一的方法 ;-)
  • 是的,我检查了文档,但找不到提供已接受连接列表的方法或属性。
  • 如果一个客户端断开连接怎么办?如何将其从列表中删除?
  • @BewarSalah 您必须为每个新的客户端连接打开一个新线程,并打开一个网络流以从客户端读取。如果您遇到类似 SocketException 的异常或关闭客户端连接,则需要将其从列表中删除。请注意,这里需要一个线程安全列表。
  • @BewarSalah:您可以使用这些作为参考:套接字连接:msdn.microsoft.com/en-us/library/… 线程安全列表:stackoverflow.com/questions/9995266/…
猜你喜欢
  • 2010-11-15
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多