2017-12-30 47 views
0

Kürzlich habe ich einen Server gemacht, der die Eingaben mehrerer Clients verarbeiten soll. Ich habe es funktioniert und derzeit gibt es einen Thread pro Client-Socket für die Eingabe über ObjectInputStream in einer Schleife und der Hauptserver Thread versucht manchmal zu sehr gleichen Sockets über ObjectOutputStream gleichzeitig zu schreiben, aber es wird blockiert.Java ObjectStream Socket E/A

Die Sache ist, Server muss die ganze Zeit zuhören und ich habe keine Ahnung, wie man es auch in Socket schreiben lassen kann. Ich würde mich über jeden Hinweis freuen, den Sie geben können.

Reading:

while (running) { 
    GameMessage msg = readGameMessage(); 
    handleGameMessage(msg); 
} 

private GameMessage readGameMessage() { 
GameMessage msg = null; 
try { 
    msg = (GameMessage) objectInputStream.readObject(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

return msg; 

}


auf einem anderen Thread schreiben:

private void writeGameMessage(GameMessage msg) { 
try { 
    objectOutputStream.writeObject(msg); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

}

Antwort

0

Da Java I/O blockieren I/O, das heißt, wenn keine Daten kommen, der aktuelle Thread wurde blockiert, wenn Sie also nicht die ganzen Anwendungen blockieren möchten, müssen Sie die lesen oder der Betrieb in einen Thread schreiben, wie

while (running) { 
    Socket socket = serverSocket.accpet(); 
    new Thread(new Reader(socket)).start(); 
} 

class Reader implements Runnable { 
    Socket socket; 
    public Reader(Socket socket){ 
     this.socket = socket(); 
    } 
    public void run(){ 
     socket.getInputStream(); 
     while (true) { 
     // your operation 
     } 
    } 
} 

Es gibt auch andere Möglichkeiten, dieses Problem zu lösen, wie unter Verwendung von nicht-blockierende I/O. Sie haben Möglichkeiten.

+0

Die Sache ist, Leseschleife ist bereits auf einem separaten Thread. Und trotzdem wird OutputStream sill blockiert. Ich dachte, blockierende I/O blockiert einen Thread, nicht eine Steckdose? – dntf0llow

+0

Ja, Sie haben Recht, blockieren I/O blockiert den Thread, so dass der OutputStream auch in einen neuen Thread auch einfügen muss –