[英]Missing data while sending large string over TCP. (client/server)
I have a Client/ server application where the Server is in java and Client is in Vb.net. 我有一个客户端/服务器应用程序,其中服务器位于Java中,而客户端位于Vb.net中。
When i send large string from client to server am not receiving complete text. 当我从客户端向服务器发送大字符串时,我没有收到完整的文本。 please help.
请帮忙。
code attached below. 下面的代码。
client-- 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
server-- Java 服务器-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 is only havig 8192 all the time. strRecievedData一直仅停留在8192上。
Well the short answer is that you must loop when reading from a socket because there is no guarantee how many bytes you will receive on each attempt to read. 简而言之,就是从套接字读取时必须循环,因为不能保证每次读取都会收到多少字节。
Psuedo-code: 伪代码:
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
}
}
That all being said, you've got nyumerous other problems in your code. 综上所述,您的代码中还有许多其他问题。 For example...
例如...
You allocate a 104857601 (not 104857600) byte buffer here: 您在此处分配104857601(不是104857600)字节缓冲区:
Dim outStream(104857600) As Byte
And then discard and replace that buffer with whatever contents get reurned from strValidator: 然后丢弃该缓冲区,并用从strValidator恢复的任何内容替换该缓冲区:
outStream = System.Text.Encoding.ASCII.GetBytes(strValidator.Trim)
No point in pre-allocating it just to replace it. 预分配它只是为了替换它没有意义。
Another one... 另一个...
You allocate an input buffer of a certain length: 您分配一定长度的输入缓冲区:
Dim inStream(104857600) As Byte
But then read into that buffer using the length of a different buffer: 但是,然后使用另一个缓冲区的长度读入该缓冲区:
serverStream.Read(inStream, 0, outStream.Length)
This is prone to errors depending on the lengths. 根据长度,这很容易出错。
You will also need to loop in this VB read just as for the Java read. 您还需要像在Java读取中一样循环此VB读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.