Java 客户端到 C# 服务器 TCP



问题是当我发送高达 40 KB 时,当我发送更多时一切都很好,有时收到的一半数据没有,网络流是否有限制。阅读,即使我整理了数据,我也无法确定问题来自网络流还是输出流中的 java 或 c#

C# 服务器

private void ReadData(){
if (networkStream.DataAvailable)
{
int size = GetBufferSize();
Thread.Sleep(340);
byte[] myReadBuffer = new byte[size];
int numberOfBytesRead = 0;

while (true)
{
numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
if (numberOfBytesRead >= myReadBuffer.Length)
{
break;
}
}
string str = Encoding.UTF8.GetString(myReadBuffer, 0, size);

dynamic Message = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(str);
// Android Message , JSON String
if (OnAndroidMessage != null)
{
OnAndroidMessage(Message);
}
}
}
private int GetBufferSize()
{
byte[] myReadBuffer = new byte[4];
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
} while (networkStream.DataAvailable && numberOfBytesRead < myReadBuffer.Length);
if (numberOfBytesRead > 0)
{
// reverse the byte array.
if (BitConverter.IsLittleEndian)
{
Array.Reverse(myReadBuffer);
}
return BitConverter.ToInt32(myReadBuffer, 0);
}
else
{
return 0;
}
}

Java 客户端//我也测试了这个,没有将数据削减到更小的速度,一半的数据接收到不是全部

mBufferOut = socket.getOutputStream();
private void sendMessage(final String message) {
if (mBufferOut != null && message != null) {
try {
byte[] data = message.getBytes("UTF-8");
Log.d("_TAG", "Sending: " + message);
Log.d("_TAG", "Message length: " + Integer.toString(data.length));
mBufferOut.write(toByteArray(data.length));
mBufferOut.flush();
List<byte[]> divideArray = divideArray(data, 10000);
for (byte[] dataChunk : divideArray) {
Log.e("_TAG","CHUNK SIZE > " + Integer.toString(dataChunk.length));
mBufferOut.write(dataChunk, 0, dataChunk.length);
mBufferOut.flush();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
private  List<byte[]> divideArray(byte[] source, int chunksize) {
List<byte[]> result = new ArrayList<byte[]>();
int start = 0;
while (start < source.length) {
int end = Math.min(source.length, start + chunksize);
result.add(Arrays.copyOfRange(source, start, end));
start += chunksize;
}
return result;
}

有什么想法吗?

这篇文章中的解决方案 NetworkStream 正在读取不应该存在的数据

static void ReadExact(Stream stream, byte[] buffer, int offset, int count)
{
int read;
while(count > 0 && (read = stream.Read(buffer, offset, count)) > 0) {
offset += read;
count -= read;
}
if(count != 0) throw new EndOfStreamException();
}

问题是读取它需要大小并希望获得您需要给它块并检查每个块的大小 并且读取不会从停止的地方重新开始,直到它读取量设置为读取含义,如果我设置为读取 10,那么如果它找不到 10,那么它将读取它找到的内容,例如它读取 6 ,它将返回 6 以及何时循环另一个时间 ti 读取其余的它剂量不是从 6 开始,它从 0 开始并读取到 4 所以你覆盖您的数据,如果它从第一次尝试读取 10,那么它将读取设置为完成,因此它不会从 0 开始,它需要读取已设置为它的数量以重新设置读取到新的缓冲区位置。

最新更新