0

サーバーが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 は常に 8192 しかありません。

4

1 に答える 1

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)

長さによっては誤差が生じやすい。

Java の読み取りと同様に、この VB の読み取りもループする必要があります。

于 2012-05-16T13:46:48.770 に答える