Wir haben eine Server-Client-Beziehung zwischen Java (Eclipse auf Windows/Server) und Android App (Android Studio/Client) erstellt. Die Kommunikation scheint gut, aber manchmal ist die Verbindung sehr langsam, bis die App und der Server nicht mehr reagieren. Es ist jedoch kein echter Fehler gegeben und es gibt kein Muster, wenn die Verbindung gut geht oder wenn es langsam ist.serverSocket.accept() langsam oder nicht reagierend
Wir haben hier auf Stapel nach Antworten gesucht, aber wir konnten nur Antworten bezüglich der Ausgangs- und Eingangsströme finden. Sobald jedoch die Verbindung (serverSocket.accept()) hergestellt ist, läuft das Programm gut und die Streams werden super schnell erstellt. Daher denken wir, dass das Problem bei der serverseitigen Erstellung von Sockets liegt. Das Programm muss nur maximal 30 Clients verwalten, und die einzige Kommunikation besteht aus Strings (also keine enormen Datenübertragungen).
Hinweis: Wenn eine Verbindungsakzeptanz langsam ist, müssen die nächsten kommenden Anforderungen von Clients warten. Wenn sie an der Reihe sind, werden sie wieder sehr schnell oder langsam vom Server akzeptiert. Alle Verbindungen werden auf Port 8080 hergestellt.
Der Code unseres Servers und Clients sind unten angegeben, weiß jemand, warum die Verbindung (zu einigen zufälligen Zeiten) so langsam ist?
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);
}
}
Client-Thread Code:
(nicht, wenn langsam erreicht)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"
}
CLIENT (android)
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();
}
Thanks so much!
Vergessen Sie nicht, Ihre Antwort als die richtige zu markieren :-). –