Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java套接字发送对象的速度非常慢_Java_Sockets_Connection_Server - Fatal编程技术网

通过Java套接字发送对象的速度非常慢

通过Java套接字发送对象的速度非常慢,java,sockets,connection,server,Java,Sockets,Connection,Server,我不明白为什么我的带有Socket和ServerSocket的Java服务器在发送对象时速度那么慢。这里有一个小的ping程序来演示我的问题。如果我在同一台机器上同时运行客户机和服务器,则一切正常(500毫秒(通过命令行ping到该机器的时间为20毫秒) 提前感谢 服务器: public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(Integer

我不明白为什么我的带有
Socket
ServerSocket
的Java服务器在发送对象时速度那么慢。这里有一个小的ping程序来演示我的问题。如果我在同一台机器上同时运行客户机和服务器,则一切正常(500毫秒(通过命令行ping到该机器的时间为20毫秒)

提前感谢


服务器:

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));
        Socket socket = serverSocket.accept();

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

        oos.writeObject(System.currentTimeMillis());
        long time = (long)ois.readObject();

        System.out.println(System.currentTimeMillis()-time+" ms");

    } catch (Exception e) {
        System.out.println("Some error occured");
        System.exit(1);
    }
}
public static void main(String[] args) {
    try {
        Socket socket = new Socket(args[0], Integer.parseInt(args[1]));

        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

        long time = (long)ois.readObject();
        oos.writeObject(time);

    } catch (Exception e) {
        System.out.println("Some error occured");
        System.exit(1);
    }
}
客户端:

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));
        Socket socket = serverSocket.accept();

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

        oos.writeObject(System.currentTimeMillis());
        long time = (long)ois.readObject();

        System.out.println(System.currentTimeMillis()-time+" ms");

    } catch (Exception e) {
        System.out.println("Some error occured");
        System.exit(1);
    }
}
public static void main(String[] args) {
    try {
        Socket socket = new Socket(args[0], Integer.parseInt(args[1]));

        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

        long time = (long)ois.readObject();
        oos.writeObject(time);

    } catch (Exception e) {
        System.out.println("Some error occured");
        System.exit(1);
    }
}

我浏览了一下网络,你不是唯一一个有这个问题的人

基本上,你应该做的不是:

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
你应该写:

ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
oos.flush();//Write after you send data
你会定期写:

ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
oos.flush();//Write after you send data

我也遇到同样的问题,简单连接的ping大约为400ms。请在创建套接字后尝试添加此行:
socket.setTcpNoDelay(真)

您似乎在比较服务器时间和客户端时间。两台机器之间的时钟不太可能同步到毫秒。请尝试在同一台机器上使用时钟重新编写它以测量往返时间:启动时钟,向服务器发送ping,读取响应,停止时钟。此外,
刷新流af如果这样做不起作用,您可能想尝试一下,默认设置可能不太适合这么小的邮件。@Dima调整发送和接收缓冲区大小也有帮助,谢谢。现在它与ping over命令行一样为30ms。谢谢。我将尝试一下。非常感谢。这减少了无任何原因的延迟在同一台主机上运行的客户机和服务器大约40毫秒,小于1毫秒。