Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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#插座:can';在写入套接字后,无法读取_C#_Sockets - Fatal编程技术网

C#插座:can';在写入套接字后,无法读取

C#插座:can';在写入套接字后,无法读取,c#,sockets,C#,Sockets,在我的客户机/服务器应用程序中,我的客户机将与服务器进行两项功能的通信:客户机将从服务器请求数据,或者发送数据,以便服务器保存数据。两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节为“1”,则表示请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。就像我让客户端在发送数据后读取数据一样,服务器将没有数据可读取,而它只是在尝试读取数据时崩溃 这是我的服务器代码: pri

在我的客户机/服务器应用程序中,我的客户机将与服务器进行两项功能的通信:客户机将从服务器请求数据,或者发送数据,以便服务器保存数据。两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节为“1”,则表示请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。就像我让客户端在发送数据后读取数据一样,服务器将没有数据可读取,而它只是在尝试读取数据时崩溃

这是我的服务器代码:

private const int BufferSize = 1024;
NetworkStream netstream = null;
byte[] RecData = new byte[BufferSize];
int RecBytes;

try {
     netstream = clientSocket.GetStream();
     int totalrecbytes = 0;

     using (MemoryStream ms = new MemoryStream()) {
         //When I get here, there is no data to read
         while ((RecBytes = netstream.Read(RecData, 0, RecData.Length)) > 0) {
             ms.Write(RecData, 0, RecBytes);
             totalrecbytes += RecBytes;
         }

         byte[] bytes = ms.ToArray();
         byte b = bytes[0];

         switch (b) {
             case 1:

             //Here I gather data and put it in "stream" variable


             byte[] SendingBuffer = null;
             int NoOfPackets = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(stream.Length) / Convert.ToDouble(BufferSize)));
             int TotalLength = (int)stream.Length, CurrentPacketLength, counter = 0;
             for (int i = 0; i < NoOfPackets; i++) {
                 if (TotalLength > BufferSize) {
                     CurrentPacketLength = BufferSize;
                     TotalLength = TotalLength - CurrentPacketLength;
                 }
                 else
                     CurrentPacketLength = TotalLength;
                 SendingBuffer = new byte[CurrentPacketLength];
                 stream.Read(SendingBuffer, 0, CurrentPacketLength);
                 netstream.Write(SendingBuffer, 0, (int)SendingBuffer.Length);
             }
             netstream.Flush();


         }
         catch (Exception e) {
             Console.WriteLine("EXCEPTION:\n" + e.ToString());
         }

         break;
     case 2:              
         //Code to read data

         break;
     }
 }
 netstream.Close()
 clientSocket.Close();
那个么,如何将数据发送到服务器并读取响应呢?(我甚至尝试在发送数据后让线程休眠,但没有成功。) 提前谢谢

编辑: 通过一些调试消息,我发现服务器确实读取了发送的“1”字节,但不知怎么的,它卡在了while循环中,比如,服务器就停在那里,没有更多的循环,也没有离开while循环。我在控制台中的while循环中写入“loop”,并在控制台中写入读取字节后看到了这一点。它写了一次“循环”,读的是字节。

这段代码让我担心:

     //When I get here, there is no data to read
     while ((RecBytes = netstream.Read(RecData, 0, RecData.Length)) > 0) {
         ms.Write(RecData, 0, RecBytes);
         totalrecbytes += RecBytes;
     }
您一直在阅读,直到客户端关闭连接(或关闭发送,而您没有这样做)。但是客户端只有在服务器做出响应时才会关闭。服务器回复永远不会出现。这是一个僵局

解决方案:读取单个字节以确定请求命令(
b

与问题无关,您的“打包”发送(
NoOfPackets
,…)似乎没有任何用途。只需使用
流。复制
即可写入。TCP没有数据包


更好的解决方案是放弃定制的TCP协议,使用HTTP库。所有这些担忧都消失了。您的代码中存在各种较小的问题,这些问题在TCP代码中非常常见。

Perfect。就这样。谢谢
     //When I get here, there is no data to read
     while ((RecBytes = netstream.Read(RecData, 0, RecData.Length)) > 0) {
         ms.Write(RecData, 0, RecBytes);
         totalrecbytes += RecBytes;
     }