【发布时间】:2016-06-30 12:59:17
【问题描述】:
我们在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();
}
非常感谢!
【问题讨论】:
标签: java android performance sockets serversocket