【问题标题】:Receive byte array from server to client? BinaryReader / BinaryWriter error?从服务器到客户端接收字节数组? BinaryReader / BinaryWriter 错误?
【发布时间】:2012-08-10 14:59:20
【问题描述】:

嗨,我是 C# 的新手,正在做服务器和客户端,通过 tcp/ip 套接字连接共享文本文件。我使用 BinaryReader / BinaryWriter 从客户端上传到服务器,但从服务器到客户端卡住了: 从客户端到服务器:

Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var stream = new MemoryStream();
                var writer = new BinaryWriter(stream);
                writer.Write(fileName);
                writer.Write(authorName);
                writer.Write(fileContent);
                var data = stream.ToArray();  // send this data array to server
                clientSock.Connect("192.168.7.48", 9050); // targets machine ip add and port num
                clientSock.Send(data);
                writer.Dispose();
                stream.Dispose();
                clientSock.Close();

在服务器中:

public void ReadCallBack(IAsyncResult ar) {

    String content = String.Empty;
    StateObject state = (StateObject)ar.AsyncState;
    Socket handler = state.workSocket;
    bytesRead = handler.EndReceive(ar);
    System.Diagnostics.Debug.WriteLine("Error asshole-0");
   if (bytesRead > 0)
   {
       if (flag == 0)
       {
           var stream = new MemoryStream(state.buffer);
           var reader = new BinaryReader(stream);
           fileName = reader.ReadString();
           authorName = reader.ReadString();
           fileContent = reader.ReadString();
           reader.Dispose();
           stream.Dispose();
           flag++;
           Console.Write(fileName + authorName);
           Console.Write(fileContent);
       }
       string path = @"C:\"+fileName;

       StreamWriter sw = new StreamWriter(path);
       sw.Write(fileContent);
       sw.Close();
       sw.Dispose();
       SqlCmd();
   }
   else
   {
       Invoke(new MyDelegate(LabelWrite));
   }

}

stream.Dispose();

现在我尝试使用相同的方式从服务器到客户端,但出现错误

var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);

stateObject 是错误的?

【问题讨论】:

  • 请提供一些更具体的错误信息,例如堆栈跟踪引发的异常。
  • 提供网络代码,否则我们无法为您提供帮助。
  • BinaryReader.ReadString() 期望整个字符串出现在缓冲区中,并以它的长度为前缀。 ReadInt32() 期望存在四个字节。 Socket.Receive() 可以接收部分消息,因此要么不能读取整个字符串,要么 int 缺少一个或多个字节。在开始处理之前,您必须缓冲所有输入(即在 Receive() 调用之间存储数据)。

标签: c# sockets client-server binaryreader binarywriter


【解决方案1】:

问题:可能是因为socket在缓冲区中接收数据,所以无法一次读取全部数据。 解决方案:你有没有想过当handler.EndReceive(ar)被调用时byteread有什么用。它告诉你读取的数据但意味着你必须检查你是否收到了全部数据,如果是,那么继续转成字符串。

    Public Class State
    Public CLient As Net.Sockets.Socket
    Public Const BufferConst As Integer = 100
    Public TmpBuffer(BufferConst) As Byte
    Public sb As New System.Text.StringBuilder
End Class

Public Sub SendText(txt As String, socket As Net.Sockets.Socket)
    socket.Send(System.Text.Encoding.UTF32.GetBytes(txt + "•"))
End Sub

Public Sub ReadData(ar As IAsyncResult)
    Dim state As State = ar.AsyncState
    Try
        Dim read As Integer = state.CLient.EndReceive(ar)
        If read > 0 Then
            state.sb.Append(System.Text.Encoding.UTF32.GetChars(state.TmpBuffer))
            If state.sb.ToString.IndexOf("•") > 0 Then
                'All data have been recived
                Console.WriteLine(state.sb.ToString())
            Else
                ' Not Complete Start it again
                state.CLient.BeginReceive(state.TmpBuffer, 0, state.BufferConst, Net.Sockets.SocketFlags.None, New AsyncCallback(AddressOf ReadData), state)
            End If
        End If
    Catch ex As Exception
        Console.Write("Read Error")
    End Try
End Sub

【讨论】:

    【解决方案2】:

    请记住并Flush 编写流后的流。从您到目前为止共享的 sn-ps 来看,它看起来不像有同花顺。

    查看Stream Flush 文档

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 2017-06-22
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      相关资源
      最近更新 更多