【问题标题】:Missing data while sending large string over TCP. (client/server)通过 TCP 发送大字符串时丢失数据。 (客户端服务器)
【发布时间】:2012-05-16 21:46:48
【问题描述】:

我有一个客户端/服务器应用程序,其中服务器在 java 中,客户端在 Vb.net 中。

当我从客户端向服务器发送大字符串时,没有收到完整的文本。 请帮忙。

代码附在下面。

客户端--VB.net-

      Try
         Dim clientSocket As New System.Net.Sockets.TcpClient()

        ' msg("Client Started")
        clientSocket.Connect(StrIP_Add, intPort)
        clientSocket.SendBufferSize=104857600
        '6511 6522
        ' Label1.Text = "Client Socket Program - Server Connected ..."

        Dim serverStream As NetworkStream = clientSocket.GetStream()
        Dim outStream(104857600) As Byte

        ' MsgBox(strValidator.Trim.Length)

        outStream = System.Text.Encoding.ASCII.GetBytes(strValidator.Trim)
        ' Dim outStream As Byte() = "sdsfd"
        System.Threading.Thread.Sleep(2000)
        serverStream.Write(outStream, 0, outStream.Length)
        System.Threading.Thread.Sleep(2000)
        serverStream.Flush()

        Dim inStream(104857600) As Byte
        serverStream.Read(inStream, 0, outStream.Length) '104857600) ' CInt(clientSocket.ReceiveBufferSize))
        Dim returndata As String = _
        System.Text.Encoding.ASCII.GetString(inStream)
        '  msg("Data from Server : " + returndata)
        clientSocket.Close()

    Catch ex As Exception
        ' VikUcMsg.AddMessage("<b><u>" & Page.Title & "</u></b><br><br>" & "No Connectivity on the port :" & intPort, enmMessageType.Error)


    End Try

服务器--Java

BufferedInputStream RecievedBuffer = new BufferedInputStream(
                TCPIP_Client_SOCKET.getInputStream());
        InputStreamReader RecievedInputStreamReader = new InputStreamReader(
                RecievedBuffer);

        System.out.println(RecievedBuffer.toString().length());
        //char[] RecievedChars = new char[TCPIP_Client_SOCKET
                //.getReceiveBufferSize()];

        char[] RecievedChars = new char[100000];
        //Thread.sleep(5000);
        RecievedInputStreamReader.read(RecievedChars);
        //Thread.sleep(5000);
        String strRecievedData=null;
        //Thread.sleep(5000);
        strRecievedData = new String( RecievedChars ).trim();
        //strRecievedData = RecievedChars.;
        Thread.sleep(5000);
        if (strRecievedData!=null)
        {
            System.out.println(strRecievedData);
                         }

strRecievedData 一直只有 havig 8192。

【问题讨论】:

    标签: java vb.net tcp


    【解决方案1】:

    简短的回答是,从套接字读取时必须循环,因为无法保证每次尝试读取时会收到多少字节。

    伪代码:

    while (!msgCompleted && !overallTimeout)
    {
       bytesRead = netstream.Read(readBuffer);
    
       if (bytesRead > 0)
       {
          // here append readBuffer to msgBuffer from offset to offset+bytesRead 
    
          offset += bytesRead // update offset so you can keep appending
    
         // inspect the msgBuffer to see if the message is completed
       }
    
    }
    

    话虽如此,您的代码中还有许多其他问题。比如……

    你在这里分配一个 104857601(不是 104857600)字节缓冲区:

    Dim outStream(104857600) As Byte

    然后丢弃该缓冲区并将其替换为从 strValidator 重新获得的任何内容:

    outStream = System.Text.Encoding.ASCII.GetBytes(strValidator.Trim)

    为了替换它而预先分配它没有意义。

    另一个...

    你分配了一个特定长度的输入缓冲区:

    Dim inStream(104857600) As Byte

    然后使用不同缓冲区的长度读入该缓冲区:

    serverStream.Read(inStream, 0, outStream.Length)

    根据长度,这很容易出错。

    您还需要循环读取此 VB 读取,就像读取 Java 读取一样。

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 2019-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 2015-12-26
      • 2017-10-09
      相关资源
      最近更新 更多