我們創建了java(在Windows /服務器上的eclipse)和android應用程序(android studio/client)之間的服務器客戶端關係。溝通看起來很好,但有時連接速度非常慢,直到應用和服務器不再響應。但是,沒有給出真正的錯誤,並且連接順利或緩慢時沒有任何模式。serverSocket.accept()緩慢或無響應
我們在堆棧查找答案,但我們只能找到有關輸出和輸入流的答案。但是,一旦建立了連接(serverSocket.accept()),程序運行良好,流創建速度非常快。因此我們認爲問題在於服務器端創建套接字。該程序只需處理最多30個客戶端,並且唯一的通信存在字符串(所以不需要大量的數據傳輸)。
注意:當一個連接接受速度很慢時,來自客戶端的下一個上傳請求必須等待。當輪到他們時,他們再次隨機快速或被服務器緩慢接受。所有連接都在端口8080上進行。
我們的服務器和客戶端的代碼在下面給出,有人知道爲什麼連接(在某些隨機時間)這麼慢嗎?
SERVER:
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();
}
非常感謝!
不要忘了標記你的答案是正確的:-)。 –