首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Winsock C++ - Java连接速度慢

Winsock C++ - Java连接速度慢
EN

Stack Overflow用户
提问于 2016-05-31 17:00:11
回答 1查看 351关注 0票数 0

我正在我的PC上运行一个服务器(C++ Winsock)和一个客户机(Java)。

我将一个大字节数组从我的客户端发送到服务器,虽然传输完成时没有任何错误,但我的传输速度非常慢。举个例子,对于数组大小为200.000字节的数组,传输需要3-5秒(约50 To /s)。

这是正常的吗?我不是专家,但我不应该通过局域网达到更高的速度(大约1Mb/s)吗?

以下是我的简化代码:

客户端(Java)

代码语言:javascript
运行
复制
    import ...

    public class Client {
        public static void main(String[] args) throws IOException {

            OutputStream outToServer;
            DataOutputStream out = null; 
            String serverHostname = new String ("...");
            int port = ...;

            Socket client = null;
            try {
                client = new Socket(serverHostname, port);
                outToServer = client.getOutputStream();
                out = new DataOutputStream(outToServer);

                int size = 200000;
                byte[] b = new byte[size];
                new Random().nextBytes(b);
                for(int i = 0 ; i < size ; i++){
                    out.writeByte(b[i]);
                }           
                out.close();
            } catch (UnknownHostException e) ...//Exit
              catch (IOException e) ...//Exit

            client.close();
        }
    }

和服务器(C++,Winsock)

代码语言:javascript
运行
复制
    #undef UNICODE
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>...
    // Need to link with Ws2_32.lib
    #pragma comment (lib, "Ws2_32.lib")
    // #pragma comment (lib, "Mswsock.lib")
    #define DEFAULT_BUFLEN 512
    #define DEFAULT_PORT "..."

    int __cdecl main(void)
    {
        WSADATA wsaData;
        int iResult;
        SOCKET ListenSocket = INVALID_SOCKET;
        SOCKET ClientSocket = INVALID_SOCKET;
        struct addrinfo *result = NULL;
        struct addrinfo hints;
        int iSendResult;
        char recvbuf[DEFAULT_BUFLEN];
        int recvbuflen = DEFAULT_BUFLEN;

        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) //Return

        ZeroMemory(&hints, sizeof(hints));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_flags = AI_PASSIVE;

        // Resolve the server address and port
        iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
        if (iResult != 0) ...//Return

        // Create a SOCKET for connecting to server
        ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
        if (ListenSocket == INVALID_SOCKET) ...//Return

        // Setup the TCP listening socket
        iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
        if (iResult == SOCKET_ERROR) ...//Return

        freeaddrinfo(result);

        iResult = listen(ListenSocket, SOMAXCONN);
        if (iResult == SOCKET_ERROR) ...//Return

        // Accept a client socket
        ClientSocket = accept(ListenSocket, NULL, NULL);
        if (ClientSocket == INVALID_SOCKET) ...//Return

        // No longer need server socket
        closesocket(ListenSocket);
        // Receive until the peer shuts down the connection
        int bytes = 0;
        do {
            iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
            if (iResult > 0) 
                bytes += iResult;
            else if (iResult == 0)
                //Connection Closing
            else  
                ...//Return

        } while (iResult > 0);

        printf("Received %d bytes\n", bytes);

        ...//Shutdown and Return
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-31 17:19:43

要么将OutputStream封装在BufferedOutputStream中,要么手动缓冲输出(例如,首先将字节收集到数组中,然后使用[#write(byte[])](https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html#write(byte[]%29) )。用每个字节发送数据包肯定会非常慢--请参阅Size of empty UDP and TCP packet?;空that为64个字节,即为1字节数据发送的64+1字节,为可能的传输速率(YMMV )的1/65,您可能会看到,由于消除了VM -> OS通信的额外开销,每个writeByte命令的传输速率甚至会更高。

直接净传输的经验法则是,如果您打算在短时间内反复发送比通常的以太网数据包(即明显小于1 1KiB,例如100字节)少得多的数据包,那么最好先缓冲它并集体发送它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37551635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档