【问题标题】:Android / Windows TCP client-server perfformance issueAndroid / Windows TCP 客户端-服务器性能问题
【发布时间】:2012-09-09 17:31:47
【问题描述】:

我写了 2 个应用程序:一个用于 android,使用 ServerSocket:

try {
    ServerSocket serverSocket = new ServerSocket(3215);
    while (true) {
        try {
            mConnected = false;
            if (mAllowed) {
                sendStatusReport(STATUS_IS_ALLOWED);
            } else {
                sendStatusReport(STATUS_IS_DENIED);
            }
            Socket socket = serverSocket.accept();

            wakeLock.acquire();
            DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
            if (mAllowed) {
                mConnected = true;
                sendStatusReport(STATUS_IS_CONNECTED);
                while (mAllowed) {
                    byte[] png = takeScreenshot();
                    outputStream.writeInt(png.length);

                    outputStream.write(png);
                }
                outputStream.writeLong(0);
            } else {
                outputStream.writeLong(0);
            }
            wakeLock.release();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

} catch (UnknownHostException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

另一个使用 C++ 的 Windows:

    int recv_count = 0, data_length = 0;
    const int block_size = 1024*8;
    unsigned char * data;
    unsigned char * ptr = data;
    int received_total = 0;
    int bytes_to_receive = 0;

while (received_total < data_length)
{
    if (data_length - received_total < block_size)
    {
        bytes_to_receive = data_length - received_total;
        log::obj()(this, "Left to receive %u bytes of %u, total: %u...", bytes_to_receive, data_length, received_total);
    }
    else
    {
        bytes_to_receive = block_size;
    }

    #define MSG_WAITALL 0x8
    recv_count = recv(client_socket, (char*)ptr, bytes_to_receive, MSG_WAITALL);

    if (recv_count != bytes_to_receive)
    {
        log::obj()(this, log::warning, "Received %u bytes instead of %u!", recv_count, bytes_to_receive);
    }

    ptr += recv_count;
    received_total += recv_count;
}

问题是客户端通过 WiFi 以

log::obj()(this, log::warning, "Received %u bytes instead of %u!", recv_count, bytes_to_receive);

表示如果没有 MSG_WAITALL,客户端每次调用接收 ~500-1000 字节而不是 `block_size'。

我是初学者,不明白表现不佳的原因。

【问题讨论】:

    标签: android tcp client-server


    【解决方案1】:

    尽量缓冲你的输出流,否则每次写入都会发送一个数据包。

            DataOutputStream outputStream = new DataOutputStream( new BufferedOutputStream(socket.getOutputStream()));
            if (mAllowed) {
                mConnected = true;
                sendStatusReport(STATUS_IS_CONNECTED);
                while (mAllowed) {
                    byte[] png = takeScreenshot();
                    outputStream.writeInt(png.length);
    
                    outputStream.write(png);
                }
                outputStream.writeLong(0);
            } else {
                outputStream.writeLong(0);
            }
            outputStream.flush();
    

    唯一改变的是第一行和最后一行。

    【讨论】:

    • 感谢您的回答!经测试。没有结果....
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2022-01-22
    • 2011-08-14
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多