Ich arbeite an einer Java-Client/Server-Anwendung mit einer ziemlich spezifischen Reihe von Regeln, wie ich sie entwickeln muss. Der Server erstellt eine Instanz mit Eingabe- und Ausgabeströmen für den Client-Socket, und jede Eingabe und Ausgabe zwischen ihnen wird durch Ereignisse in der Client-GUI ausgelöst.Java - Können zwei Threads auf der Clientseite den gleichen Eingabestream vom Server verwenden?
Ich habe jetzt in der Funktionalität serverseitig hinzugefügt, die periodische Updates an alle angeschlossenen Clients senden wird (durch Speichern jedes erstellten PrintWriter
Objekts aus ClientHandlers
in einem ArrayList<PrintWriter>
). Ich brauche einen äquivalenten Mechanismus clientseitig, um diese Nachrichten zu verarbeiten, und mir wurde gesagt, dass dies in einem zweiten clientseitigen Thread geschehen muss, dessen run()
-Methode eine do...while(true)
-Schleife verwendet, bis der Client die Verbindung trennt.
Das alles macht für mich bisher Sinn, mit dem ich kämpfe ist die Tatsache, dass die beiden Threads den einen Eingabestream teilen müssen, und im Wesentlichen "ignorieren" alle Nachrichten, die nicht von dem Typ sind Griff. In meinem Kopf, sollte es in etwa so aussehen:
Unter der Annahme, dass jede Nachricht vom Server ein boolean
Wert true
auf einer Nachricht zu allen, und einem Wert false
auf einer Nachricht an einen einzelnen Client sendet ...
Existing Client Thread
//method called from actionPerformed(ActionEvent e)
//handles server response to bid request
public void receiveResponse()
{
//thread should only process to-specific-client messages
if (networkInput.nextBoolean() == false)
{
//process server response...
}
}
Second Client-side Thread
//should handle all messages set to all clients
run()
{
do {
if (networkInput.nextBoolean() == true)
{
//process broadcasted message...
} while (true);
}
Als sie brauchen die gleichen Eingangsstrom zu verwenden, würde ich natürlich wait/notify
Anrufe einige synchronized
, das Hinzufügen, aber im allgemeinen ist, was ich suche hier möglich zu tun? Oder werden die zwei Threads, die versuchen, aus dem gleichen Eingabestrom zu lesen, sich gegenseitig zu sehr stören?
Bitte lassen Sie mich wissen, was Sie denken!
Danke, Mark
'InputStream' ist nicht threadsicher; wenn möglich mit Synchronisierung würde ich versuchen, es zu vermeiden. –
Es ist initialisiert als 'Scanner (socket.getInputStream())', ist das genauso schlimm? Ich liebe nicht die Art, wie es strukturiert ist, aber ich kann es nicht anders sehen, da mir gesagt wurde, dass die clientseitige Verarbeitung in zwei separaten Threads erfolgen muss. Irgendwelche Alternativen, von denen ich weiß, dass ich vermisse? @ElliottFrisch – marcuthh
Ein Stream muss von einem einzelnen Thread gelesen werden, es sei denn, Sie können das Ziel bestimmen, bevor Sie diesen Booleschen Wert gelesen haben, was eindeutig nicht der Spezifikation entspricht. - Benutze einen Thread um den Stream zu lesen und ... naja Peter hat es runter ... – laune