【问题标题】:Do i need multiple streams and TCP clients to make a chat application in c#我是否需要多个流和 TCP 客户端才能在 C# 中创建聊天应用程序
【发布时间】:2012-11-16 15:31:58
【问题描述】:

我在服务器上使用以下代码进行服务器和客户端之间的通信

TcpListener server = new TcpListener(IPAddress.Any, 9999);
server.Start();

Console.WriteLine("Waiting for client connections");
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client request accepted");

NetworkStream stream = client.GetStream();
StreamReader reader = new StreamReader(stream);
StreamWriter writer = new StreamWriter(stream);

现在这段代码可以很好地连接单个客户端,但是我需要做哪些调整才能允许多个客户端连接到我的服务器?

我是否需要在每个客户端的新端口上安装一个新的 TCP 侦听器?我需要多个 TCP 客户端和流吗?让这个代码能够处理 >1 个客户的简要指南将不胜感激。

【问题讨论】:

  • 是的,您需要处理多个连接来处理多个客户端。除非您解决了一个非常严重的问题(事实上您的服务器代码将接受单个客户端然后断开连接),否则您将面临修改现有 oode 的巨大挑战。
  • 简而言之,你只需要一个监听器,但需要多个流。每次客户端连接时,您都接受连接。您将需要一个客户端类来处理所有这些。我建议您寻找一些示例代码(它很丰富),而不是详细说明并发布答案。
  • 有两种方法,要么需要使用异步套接字,要么需要为每个接受的 TcpClient 创建一个新线程,在新线程中启动无限循环,然后等待听。使用线程技术根本无法很好地扩展。

标签: c# sockets networking network-programming tcpclient


【解决方案1】:

您可能希望将server.AcceptTcpClient() 放在一个循环中,因为每次新客户端连接时它都会返回另一个TcpClient。您可以在 MSDN 文档here: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient.aspx中看到一个简单的示例

【讨论】:

  • 我建议为每个新连接创建一个新线程。 MSDN 链接就是一个很好的例子,但它一次只能处理一个客户端。恕我直言...
  • @paulsm4 我同意,你可能不想让它全部在一个线程上运行,但我不想涉及太多毛茸茸的细节。
【解决方案2】:

你仍然会有一个监听器......但每个“接受”应该产生一个不同的线程或任务。然后新线程将创建它自己的流。

【讨论】:

    【解决方案3】:

    在服务器端做这样的事情:

                while (true)
                {
                  if (server.Pending()) // if there are any pending connections to server
                      {
                          //accept tcpClient and perform further operations.
                          //create a different thread per client
                       }
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多