Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 serverSocket.accept()速度慢或无响应_Java_Android_Performance_Sockets_Serversocket - Fatal编程技术网

Java serverSocket.accept()速度慢或无响应

Java serverSocket.accept()速度慢或无响应,java,android,performance,sockets,serversocket,Java,Android,Performance,Sockets,Serversocket,我们在java(windows/server上的eclipse)和android应用程序(android studio/client)之间创建了一个服务器-客户端关系。通信似乎很好,但有时连接速度太慢,以至于应用程序和服务器不再响应。然而,并没有给出真正的错误,也并没有连接正常或缓慢的模式 我们在堆栈中寻找答案,但我们只能找到关于输出和输入流的答案。但是,一旦建立了连接(serverSocket.accept()),程序就可以正常运行,并且流的创建速度非常快。因此,我们认为问题在于服务器端创建套

我们在java(windows/server上的eclipse)和android应用程序(android studio/client)之间创建了一个服务器-客户端关系。通信似乎很好,但有时连接速度太慢,以至于应用程序和服务器不再响应。然而,并没有给出真正的错误,也并没有连接正常或缓慢的模式

我们在堆栈中寻找答案,但我们只能找到关于输出和输入流的答案。但是,一旦建立了连接(serverSocket.accept()),程序就可以正常运行,并且流的创建速度非常快。因此,我们认为问题在于服务器端创建套接字。该程序最多只需要处理30个客户端,并且唯一的通信是字符串(因此没有大量的数据传输)

注意:当一个连接接受缓慢时,来自客户端的下一个上传请求必须等待。当轮到他们时,服务器会随机地快速或缓慢地接受他们。所有连接均在端口8080上进行

下面给出了我们的服务器和客户端的代码,有人知道为什么连接(在某些随机时间)如此缓慢吗

服务器:

    public void run() {
        keepGoing = true;
    try {
        serverSocket = new ServerSocket(port);

        while (keepGoing) {
            display("Server waiting for Clients on port " + port + ".");

            Socket socket = serverSocket.accept(); //<---our problem
            if (!keepGoing)     break;
            ClientThread t = new ClientThread(socket, this); //<---program doesnt reach this code when it is slow. One client thread exists for each connection.
    }catch (IOException e) {
        String msg = sdf.format(new Date())
                + " Exception on new ServerSocket: " + e + "\n";
        display(msg);
        }
    }
客户端(android)


非常感谢

编辑:尝试此处提到的BufferedStreamReader:

而不是:

sOutput = new ObjectOutputStream(socket.getOutputStream());
使用:

并用以下物质冲洗:

sOutput.flush();

InputStream也是如此,请使用BufferedInputStream。

您应该将主服务器循环(while(keepGoing)…)提取到run方法中,并使服务器实现Runnabel接口。然后创建一个新线程并启动它

例如:

public class Server implements Runnable{
    private Thread thread;
    public Server(){
        thread = new Thread(this);
        thread.start(); //I would create start() and stop() methods but for simplicity I just use thread.start()
    }

    @Override
    public void run(){
        //while....
    }
}

我希望你明白我想说的话,否则只需发表评论,我将升级我的示例;)

在开始循环之前,应该在
run()
方法中的
ClientThread
中创建流。不在构造函数中。否则,您将在accept线程中执行I/O,这会减慢它的速度


我不知道你为什么在客户端创建线程只是为了立即加入它。

结果我们遇到了路由器问题。将所有平板电脑和计算机连接到本地热点时,运行非常平稳!请大家提供帮助:D

是否在serverSocket.accept()之前或之后添加了此代码?在接受之后,我在上面的答案中添加了代码没有帮助:(仍然没有来自clientthread构造函数的autput:(奇怪的事情…我们用你的建议更改了代码,没有工作,改回来了,现在似乎运行正常…我不知道了哈哈!我搜索了一点,发现你应该使用BufferedOutputStream。看看这个链接,我希望它能帮到你:情况已经是这样了,我忘了在代码标题中包含它,借口:)我将更新标题。我尝试重新定位创建streams代码的位置,问题似乎得到了解决。关于连接的位置:我遵循了教程(第一次服务器客户端编程)并复制了部分代码。我也不知道它为什么在那里,我应该删除它吗?你应该删除线程。这不仅仅是关于“加入的位置”。质量差的代码,无论其来源如何。请发布你当前的代码。将其编辑到你的问题中。如果我删除线程,应用程序在尝试建立连接时会崩溃。“应用程序已停止运行”。删除join()时,出现错误:尝试调用虚拟方法“java.lang.Object java.io.ObjectInputStream.readObject()'在空对象引用Anne上,我无法对看不到的代码进行注释。请按照我8小时前的要求进行操作,现在请将客户端代码包含在'removed thread'中。不要忘记将您的答案标记为正确的:-)。
sOutput = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
sOutput.flush();
public class Server implements Runnable{
    private Thread thread;
    public Server(){
        thread = new Thread(this);
        thread.start(); //I would create start() and stop() methods but for simplicity I just use thread.start()
    }

    @Override
    public void run(){
        //while....
    }
}