2016-04-02 2 views
0

Ich baue einen Java-Client und -Server, der mein Zahlenspiel spielt. Der Server teilt dem Client den Nummernbereich mit, der Client gibt eine Schätzung ein und der Server gibt "Try Again" oder die Nummer zurück, wenn der Client die richtige Nummer erraten hat. Der Server muss auch Multithread sein.Wie können der Client und der Server warten, bis der andere die nächste Nachricht sendet?

Ich habe bis zu dem Teil, wo der Server den Bereich sendet, aber ich kann den Server und den Client nicht an den Punkten, die durch die Kommentare in Client.java und WorkerRunnable.java angegeben. Ich brauche den Server und den Client, um an dieser Stelle anzuhalten, so dass er auf den Empfang der Nachricht vom entsprechenden Absender wartet.

import java.net.ServerSocket; 
import java.net.Socket; 
import java.io.IOException; 

public class GameServer implements Runnable{ 

    public int serverPort = 8080; 
    public ServerSocket serverSocket = null; 
    public boolean isStopped = false; 
    public Thread runningThread = null; 

public GameServer() { 
    this.serverPort = 8080; 
} 

public GameServer(int port) { 
    this.serverPort = port; 
} 

public void run() { 

    synchronized(this) { 
     this.runningThread = Thread.currentThread(); 
    } 
    openServerSocket(); 
    while(!this.isStopped) { 
     Socket clientSocket = null; 
     try { 
      clientSocket = this.serverSocket.accept(); 
     }catch (IOException e) { 
      if(this.isStopped) { 
       System.out.println("The server has been stopped."); 
       return; 
      } 
     } 
     new Thread(new WorkerRunnable(clientSocket, "Oi m8")).start(); 
    } 
    System.out.println("The server has been stopped."); 

} 

    public synchronized void stop() { 
     this.isStopped = true; 
     try { 
      this.serverSocket.close(); 
     }catch (IOException e) { 
      System.out.println("Error closing server.");  
     } 
    } 

    private void openServerSocket() { 
     try { 
      this.serverSocket = new ServerSocket(this.serverPort); 
     }catch (IOException e) { 
      System.out.println("Error opening server."); 
     } 
    } 

} 


public class Server { 

    public static void main(String [] args) { 

     GameServer server = new GameServer(9000); 
     new Thread(server).start(); 

     System.out.println("The Server has started."); 

    } 

} 


import java.io.*; 
import java.net.*; 

public class Client { 

    public static void main(String [] args) throws IOException{ 

     Socket clientSocket = new Socket("localhost", 9000); 

     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 

     String serverMessage; 
     String clientMessage; 

     serverMessage = inFromServer.readLine(); 
     System.out.println(serverMessage); 

     System.out.print("Enter a number: "); 
     String num = inFromUser.readLine(); 

     //I need for the client to wait here as well. 

     System.out.println("ugh"); 

    } 

} 


import java.net.*; 
import java.io.*; 
import java.util.*; 

public class WorkerRunnable implements Runnable{ 

    public Socket clientSocket = null; 
    public String serverText = null; 

    public int number = -1; 
    public int guessCount = 0; 

    public WorkerRunnable(Socket clientSocket, String serverText) { 

     this.clientSocket = clientSocket; 
     this.serverText = serverText; 
     this.guessCount = 0; 

    } 

    public void run() { 

     try { 

      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
      OutputStream output = clientSocket.getOutputStream(); 

      Random rand = new Random(); 
      number = rand.nextInt(10); 

      output.write(("Guess an integer between 0 and 10." + number).getBytes()); 

      //I need for the server to wait here 

      output.close(); 


     }catch (IOException e) { 

      System.out.println("Something went wrong."); 

     } 

    } 

} 
+1

Warum? Sie werden bei jedem Lesen blockiert, bis Daten eintreffen. Warum brauchen Sie sie danach zu blockieren? – EJP

+0

Ja, das war das Problem, auf das ich stieß. Wie kann ich es reparieren? –

+0

Es ist kein Problem und es muss nicht repariert werden. In der Tat ist es die Antwort auf die Frage in Ihrem Titel, die nicht mit dem Körper Ihrer Frage übereinstimmt. Unklar, was du verlangst. – EJP

Antwort

1

Ihr Problem ist, dass Sie Zeilen lesen, aber Sie schreiben keine Zeilen. Sie müssen den Nachrichten einen Zeilenabschluss hinzufügen.

Es hat nichts mit Ihrem Titel oder was Sie fragen in der Körper Ihrer Frage, die sowieso nicht übereinstimmen. Die Lesevorgänge werden blockiert, bis Daten eintreffen. In diesem Fall wird readLine() blockiert, bis ein Leitungsabschluss oder ein Ende des Datenstroms ankommt.

+0

Danke. Das hat mein Problem behoben. –

Verwandte Themen