【发布时间】:2019-02-26 11:16:07
【问题描述】:
问题是,当我发送最多 40 KB 时,一切都好,当我发送更多时,有时收到一半的数据,有时没有,网络流是否有限制。读取,即使我收集数据,我也可以' t 确定问题是来自网络流还是输出流的 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 Client // 我也测试了这个,没有将数据缩减到更小的速度,一半的数据不是全部接收到的
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;
}
有什么想法吗?
【问题讨论】:
-
至少你的阅读码无效。它总是试图从一开始就读取一个完整的缓冲区,如果没有,它会再次尝试覆盖缓冲区,而不是从中断的地方继续。可能不是问题,但可能会导致问题。
-
id 不明白你的意思,我如何读取缓冲区无效或在哪里?
-
没有多少地方可以读到流。你的代码说“读这么多到缓冲区的开头”,然后检查它是否真的读了这么多。如果没有,它会说完全相同的内容,它会覆盖您已经阅读的内容并再次期望获得全部数据。如果允许流返回不完整的数据,则可能一次又一次。如果不是整个循环是不必要的。