Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#多线程套接字服务器接收数据_C#_Multithreading_Sockets - Fatal编程技术网

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

C#多线程套接字服务器接收数据,c#,multithreading,sockets,C#,Multithreading,Sockets,我开发了这个小型多线程套接字服务器,它创建一个套接字来不阻塞主程序,并为每个新接受的连接创建另一个线程 问题是在读取数据时,我有一个名为receiveData的方法,它读取所有输入的数据,因此现在代码对每个连接只读取一次 我通过在方法receiveData中添加带有标志socket.CanRead的while循环来解决这个问题,这个标志到底做了什么?CanRead和DataAvailable之间有什么区别 class Server { static void receiveData(Tc

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

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

我通过在方法
receiveData
中添加带有标志
socket.CanRead
的while循环来解决这个问题,这个标志到底做了什么?
CanRead
DataAvailable
之间有什么区别

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 ();
    }
}

可以阅读:

获取一个值,该值指示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.");
  }

可以阅读:

获取一个值,该值指示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
用于确定网络流是否支持读取
NetworkStream.DataAvailable
显示当前是否有数据要读取。因此,您应该使用
NetworkStream.CanRead
来确定它是否可读,并使用
NetworkStream.DataAvailable
来确定是否有要读取的内容。

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

MSDN是您最好的朋友,谢谢!是什么决定了网络流可以读取?@redigaffi我自然认为这意味着TCP连接保持打开状态。谢谢,现在我明白了,所以我应该在receiveData中添加一个while循环,该循环的条件是strem.CanRead,并在一个条件中检查stream.DataAvailable?这应该是避免在没有数据的情况下尝试读取数据的正确方法。多谢各位@是的,就像示例代码一样。将此标记为答案?MSDN是您最好的朋友嘿,谢谢!是什么决定了网络流可以读取?@redigaffi我自然认为这意味着TCP连接保持打开状态。谢谢,现在我明白了,所以我应该在receiveData中添加一个while循环,该循环的条件是strem.CanRead,并在一个条件中检查stream.DataAvailable?这应该是避免在没有数据的情况下尝试读取数据的正确方法。多谢各位@是的,就像示例代码一样。将此标记为答案?