2016-09-02 3 views
-1

서버와 클라이언트 클래스가 있고 서버와 클라이언트가 서로 메시지를 교환합니다. 이 코드는 테스트 목적으로 만들어진 다소 어리 석으며 작동하는 방식은 다음과 같습니다. 파티 (클라이언트/서버)가 메시지를 보낼 때 상대방이 지금까지 보낸 모든 메시지를받습니다 (InputStream 비었다). 이를 구현하는 코드의 조각, 루프 서버의를 클라이언트의 동안 내부에 위치하며 :소켓 출력이 수신되지 않습니다.

가 클라이언트 :

public class ClientSocketRunner { 
    private static String ip="localhost"; 
    private static int port=440; 
    private static String client="Client"; 
    private static String server="Server"; 

    public static void main(String[] args) throws Exception 
    { 
     ClientSocketRunner socket_runner=new ClientSocketRunner(); 
     socket_runner.run(); 
    } 

    private void run() throws Exception 
    { 
     Socket client_socket=new Socket(ip, port); 
     OutputStream os=client_socket.getOutputStream(); 
     InputStream is=client_socket.getInputStream(); 

     PrintStream make_output=new PrintStream(os); 
     BufferedReader read_input=new BufferedReader(new      
     InputStreamReader(is)); 

     make_output.println("Hello, I'm the Client"); 
     System.out.println(read_input.readLine()); 
     System.out.println("my port: "+client_socket.getLocalPort()); 

     String line=null; 
     BufferedReader user_input=new BufferedReader(new 
      InputStreamReader(System.in)); 
     while (!(line=user_input.readLine()).equals("-1")) 
     { 
       make_output.println(client+": "+line); 
       make_output.flush(); 
       System.out.println("sent"); 
       while (is.available()>0) 
     { 
      System.out.println(read_input.readLine()); 
     } 
       System.out.println("bytes: "+is.available()); 
     } 

     while (is.available()>0) 
     { 
      System.out.println(read_input.readLine()); 
     } 

    } 

[서버 :

public class ServerSocketRunner { 
    private static int port=440; 
    private static String client="Client"; 
    private static String server="Server"; 




    public static void main(String[] args) throws Exception 
    { 
     ServerSocketRunner ssRunner=new ServerSocketRunner(); 
     ssRunner.run(); 
    } 

    public void run() throws Exception 
    { 

     ServerSocket server_socket=new ServerSocket(port); 
     Socket socket=server_socket.accept(); 
     InputStream sin=socket.getInputStream(); 
     OutputStream sout=socket.getOutputStream(); 
     BufferedReader read_input=new BufferedReader(new InputStreamReader(sin)); 
     PrintStream make_output=new PrintStream(sout); 



     System.out.println(read_input.readLine()); 
     make_output.println("Good to meet you, I'm the Server"); 
     System.out.println("my port: "+socket.getLocalPort()); 

     String line; 
     BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in)); 



     for (line=user_input.readLine(); !(line.equals("-1")); line=user_input.readLine()) 
      { 
       make_output.println(server+": "+line); 
       make_output.flush(); 
       System.out.println("sent"); 
       while (sin.available()>0) 
       { 
        System.out.println(read_input.readLine()); 
       } 
      } 

     } 

    } 

그러나이 작동하지 않습니다 예상대로 . 여러 줄 입력을 만들면 각 줄마다 인쇄 ("보낸")되지만 상대방에게 가서 예상되는 입력이 나타나지 않는 줄을 보내십시오. 당사자 간의 다음 상호 작용이있을 때까지. 무엇이 문제인가?

+2

당신은 제대로 끝 스트림 확인되지 않습니다 당신은 NPE를 얻을 것이고, 당신은'available()'의 고전적인 오용을 가지고 있습니다. 그들은 완전한 라인을 사용할 수 없다면'readLine()'에서 여전히 블록킹 할 것이므로 무의미합니다. – EJP

+0

@EJP, 그래서 문제는, 나는 너무 짧은 줄을 입력하기 때문에 다른 쪽에서는 읽을 수 없습니까? 그러나이 문제는 단순히 다음과 같이 사용자 입력을 읽고 표시 할 때 왜 발생하지 않습니까? 'BufferedReader user_input = new BufferedReader (new InputStreamReader (System.in));, while (! (line = user_input.readLine()) .equals ("- 1")),'System.out.println ("User :"+ line); 가장 짧은 줄까지도 정확하고 즉각적으로 표시됩니다. – parsecer

+0

아니요. 문제가 무엇인지는 말하지 않았습니다. 나는 * 당신이'available()'을 무의미하게 호출하고 있다고 * 주석을 달았습니다. 그것을 제거하십시오. – EJP

답변

0

실제로이 코드는

을 예상대로 실행되지만 원하는 경우, 예를 들어, 서버가 즉시
코드 클라이언트의 입력의 용도를 표시하므로,

public class ServerSocketRunner { 
    private static int port=440; 
    private static String client="Client"; 
    private static String server="Server"; 

public static void main(String[] args) throws Exception 
{ 
    ServerSocketRunner ssRunner=new ServerSocketRunner(); 
    ssRunner.run(); 
} 

public void run() throws Exception 
{ 

    ServerSocket server_socket=new ServerSocket(port); 
    Socket socket=server_socket.accept(); 
    InputStream sin=socket.getInputStream(); 
    OutputStream sout=socket.getOutputStream(); 
    BufferedReader read_input=new BufferedReader(new InputStreamReader(sin)); 
    PrintStream make_output=new PrintStream(sout); 

    System.out.println(read_input.readLine()); 
    make_output.println("Good to meet you, I'm the Server"); 
    System.out.println("my port: "+socket.getLocalPort()); 

    String line; 
    BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in)); 

    // here starts updated code 

    while(true) 
    { 
     if (user_input.ready()) 
     { 
      line=user_input.readLine(); 

      if(line.equals("-1")) { 
      break; 
      } 
      make_output.println(server+": "+line); 
      make_output.flush(); 
      System.out.println("sent"); 
     } 

     while (sin.available()>0) 
     { 
      System.out.println(read_input.readLine()); 
     } 
     Thread.sleep(500); 
    } 
    } 
} 


public class ClientSocketRunner { 
    private static String ip="localhost"; 
    private static int port=1440; 
    private static String client="Client"; 
    private static String server="Server"; 

    public static void main(String[] args) throws Exception 
    { 
     ClientSocketRunner socket_runner=new ClientSocketRunner(); 
     socket_runner.run(); 
    } 

    private void run() throws Exception 
    { 
     Socket client_socket=new Socket(ip, port); 
     OutputStream os=client_socket.getOutputStream(); 
     InputStream is=client_socket.getInputStream(); 

     PrintStream make_output=new PrintStream(os); 
     BufferedReader read_input=new BufferedReader(new InputStreamReader(is)); 

     make_output.println("Hello, I'm the Client"); 
     System.out.println(read_input.readLine()); 
     System.out.println("my port: "+client_socket.getLocalPort()); 

     String line=null; 
     BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in)); 
     // here starts updated code 

     while(true) 
     { 
      if (user_input.ready()) 
      { 
       line=user_input.readLine(); 

       if(line.equals("-1")) { 
       break; 
       } 
       make_output.println(server+": "+line); 
       make_output.flush(); 
       System.out.println("sent"); 
      } 

      while (is.available()>0) 
      { 
       System.out.println(read_input.readLine()); 
      } 
      Thread.sleep(500); 
     } 
    } 
} 
+0

코드를 이용해 주셔서 감사합니다. 이 간소화 된 버전을 통해 직접 스레드를 살펴 보았습니다. 하지만 제 코드는 작동하지 않습니다. 정확히 여러 줄을! 첫 번째 줄이 도착하지만 다른 줄은 나중에 마술을 통해 도착합니다 ... – parsecer

관련 문제