2016-11-29 1 views
0

Ich habe einen Server- und Client-Code. Auf meinem Server warte ich auf die Verbindung und erstelle zwei Threads (momentan nur zwei Clients). Hier ist ein Ausschnitt meines Servercodes.Übergabe von verschiedenen Werten an Threads in Java-Netzwerken?

while (true) { 
      try { 
       Socket client = server.accept(); 
       int i; 
       for (i = 0; i < 2; i++) { 
        if(threads[i] == null) { 
         (threads[i] = new ClientThread(client, threads, i + 1)).start(); 
         break; 
        } 
       } 
       if(i == 2) { 
        PrintStream os = new PrintStream(client.getOutputStream()); 
        os.println("Server too busy. Try later."); 
        os.close(); 
        client.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

In meiner ClientThread-Klasse habe ich diesen Konstruktor und Run-Methode.

public ClientThread(Socket sock, ClientThread[] threads, int count) { 
      this.clientSocket = sock; 
      this.threads = threads; 
      this.count = count; 
     } // end constructor 

     public void run() { 
      ClientThread[] threads = this.threads; 

      try { 
       is = new DataInputStream(clientSocket.getInputStream()); 
       os = new DataOutputStream(clientSocket.getOutputStream()); 
       os.writeUTF("Hello client"+count); 
       System.out.println("Client sent =>"+ is.readUTF()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      for (int i = 0; i < 2; i++) { 
       if (threads[i] == this) { 
        threads[i] = null; 
       } 
       } 

      try { 
       is.close(); 
       os.close(); 
       clientSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } // end run method 

I einen Server leite und wenn ein Client verbunden wird, erhält der Kunde eine Schnur (zusammen mit count) wird diese ausgedruckt. Jetzt sollte sich auch ein anderer Client verbinden und eine erhöhte Anzahl erhalten. Aber wenn ich meinen Code ausführe, startet der Server, und selbst wenn ich zwei Clients laufen lasse, bekomme ich immer nur 1 als Ausgabe, die gezählt wird, anstatt 1 für den ersten Client und 2 für den zweiten Client. Wohin gehe ich falsch?

Edit: Mein Client ist ein einfacher Socket-Code, der utf liest und utf schreibt. Das ist es.

Antwort

0

Ich denke, Ihr Programm ist richtig. Versuchen Sie einfach herauszufinden, warum die Ausgabe so ist.

Denken Sie über diese Situation, Bevor der Server die Daten übernimmt von der zweiten Client gesendet:

Socket client = server.accept(); 

Das Gewinde für den ersten Client (wir es als Faden annehmen [0] nach Ihren Code) hat seine Arbeit beendet, die Sie null bedeutet zuordnen einzufädeln [0]:

for (int i = 0; i < 2; i++) { 
    if (threads[i] == this) { 
     threads[i] = null; 
    } 
} 

Danach wird der Server durchgeführt wird versucht, die Daten zu akzeptieren gesendet von dem zweiten Client so in der Schleife:

for (i = 0; i < 2; i++) { 
    if(threads[i] == null) { 
     (threads[i] = new ClientThread(client, threads, i + 1)).start(); 
     break; 
    } 
} 

die thread[0] ist noch null und die count ist noch 1 und Sie werden immer noch die 1 als Ausgabe erhalten.

Vorschlag: Wenn Sie in der gleichen Zeit arbeiten mehrere Threads möchten, können Sie Ihren Code ändern:

... 
is = new DataInputStream(clientSocket.getInputStream()); 
os = new DataOutputStream(clientSocket.getOutputStream()); 
os.writeUTF("Hello client"+count); 
System.out.println("Client sent =>"+ is.readUTF()); 
TimeUnit.MILLISECONDS.sleep(100);// Add this line to simulate working 
... 
Verwandte Themen