【问题标题】:Java client to C# server TCPJava 客户端到 C# 服务器 TCP
【发布时间】: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 不明白你的意思,我如何读取缓冲区无效或在哪里?
  • 没有多少地方可以读到流。你的代码说“读这么多到缓冲区的开头”,然后检查它是否真的读了这么多。如果没有,它会说完全相同的内容,它会覆盖您已经阅读的内容并再次期望获得全部数据。如果允许流返回不完整的数据,则可能一次又一次。如果不是整个循环是不必要的。

标签: java c# tcp


【解决方案1】:

来自这篇帖子NetworkStream is reading data that should not be there的解决方案

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 开始,它需要读取已设置的数量以重新设置读取到新的缓冲区位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2019-09-28
    • 2013-08-20
    • 2014-09-08
    相关资源
    最近更新 更多