2017-02-02 9 views
0

터미널에서 서버에서 클라이언트로 메시지를 전달하려고합니다. 프로그램에서 수행하고자하는 것은 클라이언트에서 명령을 입력하고 서버에서 응답을 받아야하며 클라이언트를 재시작하지 않고 다른 명령을 입력 할 수 있어야합니다 (Java 클라이언트에 의해).Java 클라이언트 서버

Client.java

Socket socket = new Socket(host, port); 
InputStream is = socket.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 

String response = ""; 

boolean continuation = true; 
while(continuation) { 
    Scanner input = new Scanner(System.in); 
    String command = (input.nextLine()).toString(); 
    bw.write(command+"\r\n"); 
    bw.flush(); 

    if(command.equals("cmd1") { 
     while ((response = br.readLine()) != null) { 
      System.out.println(response); 
     } 
    } 
    System.out.println("This line will not execute as well."); 
} 

Server.java

InputStream is = socket.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 

OutputStream os = socket.getOutputStream(); 
OutputStreamWriter osw = new OutputStreamWriter(os); 
BufferedWriter bw = new BufferedWriter(osw); 

String[] in = br.readLine().split("\\s+"); 
String command = in[0]; 

if(command.equals("cmd1")) { 
    String response = ""; 
    response = response + "RESPONSE:\r\n"; 
    response = response + "This is a response.\r\n"; 
    bw.write(response); 

    bw.flush(); 
} 

나는 동안 ((응답 = br.readLine() 넣지 않으면! = NULL) {. ..} Client.java에서는 터미널에 여러 입력을 입력 할 수 있지만 입력하면 서버에서 응답을 인쇄하고 클라이언트를 다시 시작하지 않으면 다른 입력을 수행 할 수 없습니다.

도움을 주시면 감사하겠습니다.

감사

+0

클라이언트를 다시 시작의 무엇을 의미합니까? 응답이 null 일 때 Client.java가 종료 될 것입니다. –

+0

터미널에 명령을 입력하고 Enter 키를 누르면 클라이언트 터미널에서 인쇄되는 서버가 응답을 보내야합니다. 그러나 그 후에 다른 명령을 입력하고 서버에 응답을 입력하고 수신 할 수 없습니다. 클라이언트를 종료하고 다시 시작해야합니다. – user2556140

+0

커맨드를 입력하고 클라이언트를 재시작 할 필요없이 계속적으로 응답을 얻을 수 있기를 바랍니다. – user2556140

답변

0

이 작동합니다 :

서버 :

DataInputStream dis = new DataInputStream(socket.getInputStream()); 
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 

boolean continuation = true; 
while (continuation) { 
    String command = dis.readUTF(); 
    //proceeed command 
    dos.writeUTF("response"); 
    dos.flush(); 
} 

클라이언트 :

DataInputStream dis = new DataInputStream(socket.getInputStream()); 
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 

    dos.writeUTF("your command"); 
    while (dis.available() == 0) { 
     try { 
      //wait for response 
      Thread.sleep(1); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(RandomTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    String response = dis.readUTF(); 
    //and so on 
+0

줄 바꿈과 캐리지 리턴으로 문자열을 전달해야합니다. writeUTF를 통해 가능합니까? 또한 클라이언트로부터 지속적인 입력이 필요합니다. 예를 들어. 클라이언트 – user2556140

+0

에서 CMD2 두 번째 응답 (여기 종료하지 않고) 클라이언트 에서 CMD1 응답은 네 줄 바꿈이 된 writeUTF로도 가능합니다! 클라이언트의 지속적인 입력을 원할 경우 다른 포트를 통해 새로운 Connection을 설정해야합니다. 응답을 기다리고 응답을 두 가지 유형으로 나눕니다. 1. 명령의 응답에서 2. 일부 일반 Listener로 다른 명령 .. –

+0

사용자가 'exit'를 입력 할 때까지 클라이언트에서 루프하는 법? 서버가 응답을 보내고 클라이언트가 그것을 인쇄 한 다음 다른 '입력'에 대한 루프까지 올라 가지 않고 클라이언트를 종료하지도 않습니다. 그것은 단지 터미널의 깜박이는 커서 – user2556140