2016-05-01 2 views
0

У меня есть один TCP-клиент и один TCP-сервер, написанный на Java. Сервер ожидает инструкций от Клиента, но также должен иметь возможность отправлять инструкции клиенту. Я могу заставить Клиента отправить что-то на Сервер и дождаться ответа. Но я не могу дождаться сообщения, не отправив что-то раньше.Java TCP-клиент, прослушивающий и записывающий на TCP-сервер

TCP-клиент

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-сервер

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); 
     } 
    } 

} 

ответ

0

Типичная операция для сценария клиент-сервер для клиента отправки запросов на сервер. Однако в одноранговых приложениях обе конечные точки могут действовать как клиенты и серверы. Единственная разница была бы той конечной точкой, которая открывала соединение. В вашем случае проблема заключается в том, что только «сервер» использует поток приемника. Запустите поток получателя на стороне клиента, и ваша проблема должна быть решена. Вы в значительной степени сможете просто повторно использовать свой потоковый код с сервера в клиенте. Просто передайте сокет в поток приема после открытия соединения с сервером.

EDIT:

В клиенте:

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

где гнездо, это сокет к серверу. Возможно, вам понадобится обновить многопотоковый сервер для любых особенностей или отличий для операций с клиентами, но принцип должен быть одинаков.

+0

Не могли бы вы показать мне короткий пример о том, что вы имеете в виду с «резьбовым кодом с сервера на клиенте»? – user3653164

+0

Я имею в виду, что вам также нужно использовать потоки в коде клиента, а не только на своем сервере. Поскольку у вас уже есть код на сервере, вы можете просто повторно использовать этот код. – Andy

Смежные вопросы