2013-03-18 2 views
2

클라이언트 클래스와 서버 클래스가 있습니다. 클라이언트가 서버에 메시지를 보내면 서버는 클라이언트에 응답을 보내고 클라이언트는받은 모든 메시지를 인쇄합니다. 예를 들어Java 서버 클라이언트의 readLine() 메소드

, 클라이언트가 서버에 "A"를 보내는 경우

, 다음 서버는 "1111"클라이언트 에 응답을 보냅니다. 그래서 클라이언트 클래스에서 readLine()을 사용하여 서버에서 메시지를 읽은 다음 클라이언트에서 "1111"을 콘솔에 인쇄합니다.

클라이언트가 서버에 "B"를 보내면 서버가 클라이언트에게 응답을 보냅니다. "2222 \ n 3333". 따라서 클라이언트에서 예상되는 인쇄 출력은 다음과 같습니다

"2222"

"3333"

그래서 서버에서 클라이언트로 응답 메시지는 클라이언트에서 보내는 메시지에 따라 1 개 라인 2 개 라인을 가질 수있다 서버에.

제 질문은 어떻게 readLine()을 사용하여 서버에서 클라이언트로 보내는 메시지를 읽을 수 있는지입니다. 보다 구체적으로, 나는 다음과 같은 코드를 사용하는 경우,

String messageFromServer; 
while((messageFromServer = inputStreamFromServer.readLine()) != null) { 
    println(messageFromServer); 
} 

그것은 첫 번째 라인을 출력합니다, 나는 내의 readLine()는 것이다 그것은 일단 정지하기 때문에, 클라이언트에서 서버로 메시지를 보내는 유지하더라도 아무것도 인쇄되지 않습니다 첫 번째 줄을 읽었습니다.

업데이트 : 이보다 구체적으로는, 내가 한 번에 서버에서 하나 또는 여러 줄이 포함 된 메시지를 읽을 수있는 클라이언트 클래스에 몇 가지 방법을 찾고 있어요. 서버에서 클라이언트로 보낸 메시지의 형식을 변경하고 싶지 않은 경우 클라이언트 측에서이 작업을 수행 할 수있는 방법이 있는지 궁금합니다. 나는 몇 가지 샘플 코드를 넣어 것입니다

갱신이 내 질문이 더 명확하게하려면, 다음

이 서버입니다 :

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

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

    ServerSocket serverSocket = null; 
    try { 
    serverSocket = new ServerSocket(1234); 
} catch (IOException e) { 
    System.err.println("Could not listen on port: 1234."); 
    System.exit(1); 
} 

Socket clientSocket = null; 
try { 
    clientSocket = serverSocket.accept(); 
} catch (IOException e) { 
    System.err.println("Accept failed."); 
} 
System.out.println("Connected"); 


PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

String textFromClient =null; 
String textToClient =null; 
textFromClient = in.readLine(); // read the text from client 
if(textFromClient.equals("A")){ 
    textToClient = "1111"; 
}else if (textFromClient.equals("B")){ 
    textToClient = "2222\r\n3333"; 
} 


out.print(textToClient + "\r\n"); // send the response to client 
out.flush(); 
out.close(); 
in.close(); 
clientSocket.close(); 
serverSocket.close(); 
} 
} 

클라이언트 :

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

    Socket socket = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); 
    try { 
     socket = new Socket("localhost", 1234); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host"); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection"); 
    } 
    System.out.println("Connected"); 

    String textToServer; 

    while((textToServer = read.readLine())!=null){ 
     out.print(textToServer + "\r\n"); // send to server 
     out.flush(); 

     String messageFromServer =null; 
     while((messageFromServer = textToServer=in.readLine()) != null){ 
      System.out.println(messageFromServer); 
     } 
    } 
    out.close(); 
    in.close(); 
    read.close(); 
    socket.close(); 
} 

private static void debug(String msg) 
{ 
    System.out.println("Client: " + msg); 
} 
} 

답변

2

당신은 서버에서 전송되는 데이터의 형식을 변경할 필요가 없습니다 , 및 readLine() 작동해야하지만 서버가 플러시 또는 가능성이 사물을 설명 할 수있는 응답을 작성한 후 OutputStream 닫을 것으로 판단됩니다.
readLine() 호출이 걸려 있습니까? 서버 코드를 제어하고 있습니까? 그렇다면 포함시킬 수 있습니까? 내가 당신을 생각으로 일

개정 클래스는 기대 :

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ClientServerTest2 
{ 

    public static void main(String[] args) throws Exception 
    { 
     Thread serverThread = new Thread(new Server()); 
     serverThread.start(); 
     Thread clientThread = new Thread(new Client()); 
     clientThread.start(); 

     serverThread.join(); 
     clientThread.join(); 
    } 

    private static class Server implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      ServerSocket serverSocket = null; 
      try 
      { 
       serverSocket = new ServerSocket(1234); 

       Socket clientSocket = null; 
       clientSocket = serverSocket.accept(); 
       debug("Connected"); 

       PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
       BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

       String textFromClient = null; 
       String textToClient = null; 
       textFromClient = in.readLine(); // read the text from client 
       debug("Read '" + textFromClient + "'"); 
       if ("A".equals(textFromClient)) 
       { 
        textToClient = "1111"; 
       } 
       else if ("B".equals(textFromClient)) 
       { 
        textToClient = "2222\r\n3333"; 
       } 

       debug("Writing '" + textToClient + "'"); 
       out.print(textToClient + "\r\n"); // send the response to client 
       out.flush(); 
       out.close(); 
       in.close(); 
       clientSocket.close(); 
       serverSocket.close(); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 

     } 

     private static void debug(String msg) 
     { 
      System.out.println("Server: " + msg); 
     } 
    } 

    private static class Client implements Runnable 
    { 

     @Override 
     public void run() 
     { 
      Socket socket = null; 
      PrintWriter out = null; 
      BufferedReader in = null; 
      BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); 
      try 
      { 
       socket = new Socket("localhost", 1234); 
       out = new PrintWriter(socket.getOutputStream(), true); 
       in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       debug("Connected"); 

       String textToServer; 

       textToServer = read.readLine(); 
       debug("Sending '" + textToServer + "'"); 
       out.print(textToServer + "\r\n"); // send to server 
       out.flush(); 

       String serverResponse = null; 
       while ((serverResponse = in.readLine()) != null) 
        debug(serverResponse); // read from server and print it. 

       out.close(); 
       in.close(); 
       read.close(); 
       socket.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private static void debug(String msg) 
    { 
     System.out.println("Client: " + msg); 
    } 
} 
+0

서버 코드와 클라이언트 코드를 게시했습니다. 이것을 봐주세요. – Joey

+0

몇 가지 컴파일러 오류를 수정해야했지만 버그가있는 부분은'if (textFromClient == "A")'및'if (textFromClient == "B")'부분입니다. 그것들은'if ("A".equals (textFromClient))와 if ("B".equals (textFromClient))'로 변경 될 필요가있다. 그런 다음 원래의 게시물에서했던 것처럼 반복적으로 하나의 readLine() 호출 인'System.out.println (in.readLine());'을 대체했습니다 : while ((messageFromServer = inputStreamFromServer.readLine())! = null)'예상대로 작동했습니다. 클라이언트에서 "B"를 보내면 서버가 2 개의 예상 줄을 보냈습니다. – Blake

+0

위의 수정 된 수업을 포함하도록 지금 내 대답을 편집했습니다. – Blake

0

변경 while((messageFromServer = inputStreamFromServer.readLine() != null) ~ while((messageFromServer = inputStreamFromServer.readLine()) != null)

사실 이것도 컴파일해서는 안됩니다 ....

+0

죄송합니다. 내 문제는 구문 오류가 아닙니다. 한 번에 서버에서 여러 줄을 읽는 몇 가지 방법을 찾고 있습니다. 여기에 직접 코드를 입력했기 때문에 구문 오류가있을 수 있습니다. 나는 그것을 고쳤다. – Joey

0

해결 방법입니다.

"2222 \ n 3333"과 같이 여러 개의 문자열을 보내려는 경우.

두 문자열 사이에 분리 문자 (:)를 추가하여 보낼 수 있습니다 : "2222 : 3333".

은 그럼 당신은 받았다 문자열 구문 분석 클라이언트 측에서

clientOut.write("2222: 3333\n"); 

으로 서버 측에서 쓰기를 호출 할 수

messageFromServer = inputStreamFromServer.readLine(); 
String strArray[] = messageFromServer.split(":"); 

strArray[0] : 2222 

strArray[0] : 3333