繁体   English   中英

C#多线程套接字服务器接收数据

[英]C# Multithreading socket server receiving data

我已经开发了这种小型多线程套接字服务器,该服务器创建一个套接字以不阻塞主程序,并为每个新接受的连接创建另一个线程。

问题是在读取数据时出现的,我有一个名为receiveData的方法,该方法可以读取所有数据输入,因此,现在每个连接的代码只读取一次。

我通过在方法receiveData的内部添加一个带有标志socket.CanRead的while循环来解决此问题,此标志的作用是什么? CanReadDataAvailable有什么区别?

class Server
{
    static void receiveData(TcpClient client, NetworkStream stream)
    {
        byte[] bytes = new byte[client.ReceiveBufferSize];
        stream.Read (bytes, 0, (int) client.ReceiveBufferSize);
        string returndata = Encoding.UTF8.GetString (bytes);
        Console.WriteLine ("SERVER RECEIVED: " + returndata);              
    }

    static void startServer()
    {
        new Thread(() =>
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 5000);
            listener.Start();

            while (true)
            {
                if (listener.Pending()) {
                    new Thread(() =>
                    {
                        TcpClient client = listener.AcceptTcpClient();
                        NetworkStream stream = client.GetStream();
                        Server.receiveData(client, stream);
                    }).Start();
                }  
            }
        }).Start();
    }

    static void Main(string[] args)
    {
        Server.startServer ();
    }
}

请参考MSDN NetworkStream.CanRead属性

可以阅读:

获取一个值,该值指示NetworkStream是否支持阅读。

而DataAvailable时:

获取一个值,该值指示要在NetworkStream上读取的数据是否可用。

就像传入的数据仅在NetworkStream支持读取时才被指示为可用,因此可以被读取。

看一下示例代码,我认为它将回答您所有的问题:

 // Examples for CanRead, Read, and DataAvailable.

  // Check to see if this NetworkStream is readable.
  if(myNetworkStream.CanRead){
      byte[] myReadBuffer = new byte[1024];
      StringBuilder myCompleteMessage = new StringBuilder();
      int numberOfBytesRead = 0;

      // Incoming message may be larger than the buffer size.
      do{
           numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
           myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));

      }
      while(myNetworkStream.DataAvailable);

      // Print out the received message to the console.
      Console.WriteLine("You received the following message : " +
                                   myCompleteMessage);
  }
  else{
       Console.WriteLine("Sorry.  You cannot read from this NetworkStream.");
  }

根据MSDN文档NetworkStream.CanRead 可以读取MSDN用于确定网络流是否支持读取。 NetworkStream.DataAvailable 数据可伸缩MSDN向您显示是否有当前要读取的数据。 因此,您应该使用NetworkStream.CanRead来确定它是否可读,并使用NetworkStream.DataAvailable来确定是否有要读取的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM