以TcpClient身份接收消息

本文关键字:消息 身份 TcpClient | 更新日期: 2023-09-27 17:59:52

我一直在学习本教程"http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server"关于设置一个可以发送和接收消息并连接多个客户端的迷你服务器。

一切都很好。。但不幸的是,本教程中缺少的一点是客户端如何设置侦听器来侦听服务器。

我只有这么多:

public void SetupReceiver()
{
      TcpClient tcpClient = new TcpClient(this.Host, this.Port);
      NetworkStream networkStream = tcpClient.GetStream();
      // What next! :( or is this already wrong...
}

据我所能想象。。我需要连接到服务器(作为TcpClient)并获得流(如上所述)。然后等待消息并对其进行处理。我不能让客户端在发送消息后立即从服务器接收消息,因为客户端会向服务器发送消息,然后该消息会广播给所有连接的客户端。因此,每个客户端都需要"监听"来自服务器的消息。

以TcpClient身份接收消息

TCPclient类拥有必要的资源来启用连接、向服务器发送数据以及从服务器接收数据,而TCPListener类别本质上就是服务器。

遵循msdn页面中为TCPclient提供的一般示例,也可用于TCPListener(我对其的一般解释基于!)

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx

第一部分是将数据发送到服务器:

// Translate the passed message into ASCII and store it as a Byte array.
Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);         
// Get a client stream for reading and writing. 
NetworkStream stream = client.GetStream();
// Send the message to the connected TcpServer. 
stream.Write(data, 0, data.Length); //(**This is to send data using the byte method**)   

以下部分是从服务器接收数据:

// Buffer to store the response bytes.
data = new Byte[256];
// String to store the response ASCII representation.
String responseData = String.Empty;
// Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length); //(**This receives the data using the byte method**)
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); //(**This converts it to string**)

一旦streamreaderstreamwriter链接到网络流,字节方法就可以替换为

希望这能有所帮助!!

**PS:如果你想在c#中使用网络类获得更通用的编码体验,我个人建议你考虑使用套接字,因为它是tcpclient和tcplistener诞生的主要类。