gpt4 book ai didi

java - serverSocket.accept() 缓慢或无响应

转载 作者:行者123 更新时间:2023-11-29 09:28:20 24 4
gpt4 key购买 nike

我们在 java(windows/server 上的 eclipse)和 android app(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);
}
}

客户端线程代码:(如果慢则未达到)

    public ClientThread(Socket socket, Server s) {
this.server = s;
this.socket = socket;
System.out.println("Thread trying to create Object Input/Output Streams");
try {
// make streams
sOutput = new ObjectOutputStream(socket.getOutputStream());
sInput = new ObjectInputStream(socket.getInputStream());

// read user account info
String input = (String) sInput.readObject();
String[] accountInfo = input.split(";");
username = accountInfo[0];
password = accountInfo[1];
} "catch all problems"
}

客户端(安卓)

    Thread connect = new Thread(new Runnable() {
@Override
public void run()
{
try
{
socket = new Socket(ip.getText().toString(), portNr);
sOutput = new ObjectOutputStream(socket.getOutputStream());
sInput = new ObjectInputStream(socket.getInputStream());
}

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

"sending account information"
}
});
connect.start();
try {
connect.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

非常感谢!

最佳答案

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

我不知道你为什么要在客户端创建一个线程,然后立即加入它。

关于java - serverSocket.accept() 缓慢或无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com