2016-05-01 8 views
0

Ich habe einen TCP-Client und einen TCP-Server in Java geschrieben. Der Server wartet auf Anweisungen vom Client, sollte aber auch Anweisungen an den Client senden können. Ich kann den Client etwas an den Server senden lassen und auf eine Antwort warten. Aber ich kann es nicht schaffen, auf eine Nachricht zu warten, ohne vorher etwas zu senden.Java TCP Client hört und schreibt TCP Server

TCP-Client-

public class TCPClient { 

    static DataOutputStream toServer; 
    static BufferedReader fromServer; 
    static Socket socket; 

    public static void main(String[] args) throws Exception { 
     BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.println("*************************"); 
     System.out.println("*  Client   *"); 
     System.out.println("*************************"); 
     System.out.println("INSTRUCTION  | EFFECT"); 
     System.out.println("aktiv    | ready to do something"); 
     System.out.println("exit    | disconnect"); 
     System.out.println(); 
     System.out.print("Please enter the IP-Address of the Server: "); 
     String ip = input.readLine(); 
     System.out.println(); 

     try { 
      socket = new Socket(ip, 9999); 
     } catch (Exception e) { 
      System.out.println("Can not connect to Server!"); 
     } 

     toServer = new DataOutputStream(socket.getOutputStream()); // Datastream FROM Server 
     fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
     while (sendRequest()) {    
      receiveResponse();     
     } 
     socket.close(); 
     toServer.close(); 
     fromServer.close(); 
    } 

    private static boolean sendRequest() throws IOException { 
     BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
     String line; 
     boolean holdTheLine = true;   // Connection exists 

     System.out.print("> "); 
     line = input.readLine(); 

     switch (line) { 
      case "aktiv": 
       toServer.writeBytes("active" + '\n'); 
       break; 
      case "exit": 
       holdTheLine = false; 
       break; 
      default: 
       break; 
     } 

     return holdTheLine; 
    } 

    private static void receiveResponse() throws IOException { 
     System.out.println("Server: " + fromServer.readLine() + '\n'); 
    } 
} 

TCP-Server

public class TCPServer { 
    static boolean connected = true; 
    public static void main(String[] args) throws Exception { 
     System.out.println("********************************"); 
     System.out.println("*   Server    *"); 
     System.out.println("********************************"); 
     System.out.println("INSTRUCTION | EFFECT"); 
     System.out.println("ok   | send an ok to client"); 

     ServerSocket listenSocket = new ServerSocket(9999); 

     while (true) { 
      final Socket client = listenSocket.accept(); 

      Thread newClientThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        multithreadedServer(client); 
       } 
      }); 
      newClientThread.start(); 
     } 
    } 

    public static void multithreadedServer(Socket client) { 
     String line; 
     final BufferedReader fromClient; 
     final DataOutputStream toClient; 
     Thread cmdForClient; 

     try { 
      fromClient = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      toClient = new DataOutputStream(client.getOutputStream()); 

      while (connected) { 
       cmdForClient = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          String line = fromClient.readLine(); 
          System.out.println("Client: " + line); 
          if (line.equals("exit")) { 
           connected = false; 
          } 
         } catch (Exception e) { 
          System.out.println(e); 
         } 
        } 
       }); 
       cmdForClient.start(); 

       final BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 

       try { 
        String reply = input.readLine(); 
        if (reply.equals("ok")) { 
          toClient.writeBytes("OK." + '\n'); 
        } 
       } catch (Exception e) { 
        System.out.println(e); 
       } 
      } 
      fromClient.close(); 
      toClient.close(); 
      client.close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

} 

Antwort

0

Der typische Betrieb für ein Client-Server-Szenario für die Kunden-Anforderungen an den Server sendet. In Peer-to-Peer-Anwendungen können beide Endpunkte jedoch sowohl als Clients als auch als Server fungieren. Der einzige Unterschied wäre der Endpunkt, der die Verbindung geöffnet hat. In Ihrem Fall ist das Problem, dass nur der "Server" einen Empfänger-Thread verwendet. Starten Sie einen Empfänger-Thread auf der Client-Seite und Ihr Problem sollte gelöst werden. Sie sollten in der Lage sein, Ihren Thread-Code einfach vom Server im Client wiederzuverwenden. Übergeben Sie den Socket einfach an den Empfangs-Thread, nachdem Sie die Verbindung zum Server geöffnet haben.

EDIT:

In Ihrem Client:

  Thread newServerThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        multithreadedServer(socket); 
       } 
      }); 
      newServerThread.start(); 

wo Buchse, die Buchse mit dem Server ist. Möglicherweise müssen Sie multithreadedServer für bestimmte Details oder Unterschiede für die Client-Operationen aktualisieren, aber das Prinzip sollte das gleiche sein.

+0

Können Sie mir ein kurzes Beispiel zeigen, was Sie mit "Thread-Code vom Server im Client" meinen? – user3653164

+0

Was ich meine ist, dass Sie auch Threads in Ihrem Client-Code verwenden müssen, nicht nur auf Ihrem Server. Da Sie bereits Code auf dem Server haben, können Sie diesen Code einfach wiederverwenden. – Andy