代码之家  ›  专栏  ›  技术社区  ›  user1447679

为什么TcpClient的代码在vb.net中工作,而在c#中不工作?

  •  0
  • user1447679  · 技术社区  · 8 年前

    vb.net 有效,但在 c#

    顺便说一句 BUFFER_SIZE 等于 2048 Byte

    Dim bytesRcvd As Integer = 0
    Dim byteSendBuffer As Byte() = New Byte(BUFFER_SIZE - 1) {}
    Dim byteReceiveBuffer As Byte() = New Byte(BUFFER_SIZE - 1) {}
    Dim receiveMessage As String = Nothing
    byteSendBuffer = Encoding.ASCII.GetBytes(sendMessage)
    Dim client As System.Net.Sockets.TcpClient = Nothing
    Dim netStream As System.Net.Sockets.NetworkStream = Nothing
    
    client = New System.Net.Sockets.TcpClient("localhost", 9060)
    
    netStream = client.GetStream()
    
    netStream.Write(byteSendBuffer, 0, byteSendBuffer.Length)
    bytesRcvd = netStream.Read(byteReceiveBuffer, 0, BUFFER_SIZE)
    receiveMessage = Encoding.ASCII.GetString(byteReceiveBuffer, 0, bytesRcvd)
    netStream.Close()
    client.Close()
    

    C#:

    int bytesRcvd = 0;
    var byteSendBuffer = new Byte[BUFFER_SIZE - 1];
    var byteReceiveBuffer = new Byte[BUFFER_SIZE - 1];
    string receiveMessage = null;
    byteSendBuffer = Encoding.ASCII.GetBytes(sendMessage);
    System.Net.Sockets.TcpClient client = null;
    System.Net.Sockets.NetworkStream netStream = null;
    client = new System.Net.Sockets.TcpClient("localhost", 9060);
    
    netStream = client.GetStream();
    
    netStream.Write(byteSendBuffer, 0, byteSendBuffer.Length);
    bytesRcvd = netStream.Read(byteReceiveBuffer, 0, BUFFER_SIZE);
    
    receiveMessage = Encoding.ASCII.GetString(byteReceiveBuffer, 0, bytesRcvd);
    netStream.Close();
    client.Close();
    

    这发生在 netStream.read

    啊,是的,所以 字节 处理方式不同。。关注c版本,改变:

    var byteSendBuffer = new Byte[BUFFER_SIZE - 1];
    var byteReceiveBuffer = new Byte[BUFFER_SIZE - 1];
    

    为此:

    var byteSendBuffer = new Byte[BUFFER_SIZE];
    var byteReceiveBuffer = new Byte[BUFFER_SIZE];
    

    netStream.read

    我试着用以下材料包装:

    if(netStream.CanRead()) { ... }
    

    没用,还挂着。

    这绝对令人沮丧。我已经尝试了许多建议配置的例子。在新的 c# vb 项目仅用于TcpClient命令。不管我做什么,它都会无限期地存在 read ,但与 vb .

    好吧,所有这些麻烦和有用的建议,结果证明这是处理小细节的重大巧合之一,就像在另一端的监听服务中,我没有接触到的一样。返回要发送给侦听器的消息的过程返回了不正确的消息,侦听器没有响应数据,只是超时了。如此微小的细节(如几个字符),以至于很难发现。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Azar Shaikh    8 年前

    试试这个

     bytesRcvd = netStream.Read(byteReceiveBuffer, 0,
     byteReceiveBuffer.Length);
    

    而不是

    bytesRcvd = netStream.Read(byteReceiveBuffer, 0,
         BUFFER_SIZE );
    

    您的byteReceiveBuffer长度是2047,BUFFER\u大小是2048