2013-04-30 2 views
1

서버에 문자열을 보내기위한 다음 클라이언트 소켓이 있습니다. 서버가 메시지를 받고 있지 않습니다. 무슨 문제 일 수 있겠 니?Java 소켓이 서버에 메시지를 보내지 않습니다.

public void startClient() throws IOException { 

    Socket socket = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    InetAddress host = null; 
    BufferedReader stdIn = null; 

    try { 
     host = InetAddress.getByName("172.16.2.97"); 
     socket = new Socket(host, 52000); 

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

     stdIn = new BufferedReader(new InputStreamReader(System.in)); 
     String fromServer; 
     String fromUser = null; 
     //ClientHelper.unpackISO(); 
     fromUser = ClientHelper.createISO(); 
     if (fromUser != null) { 
      //System.out.println("Client - " + fromUser); 
      out.write(fromUser); 
      System.out.println("Sent message"); 
     } 


     while ((fromServer = in.readLine()) != null) { 
      System.out.println("Server - " + fromServer); 
      if (fromUser != null) { 
       //System.out.println("Client - " + fromUser); 
       out.println(fromUser); 
      } 
     } 
    } catch (ISOException ex) { 
     Logger.getLogger(ClientDemo.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (UnknownHostException e) { 
     System.err.println("Cannot find the host: " + host.getHostName()); 
     System.exit(1); 
    } catch (IOException e) { 
     System.err.println("Couldn't read/write from the connection: " +   e.getMessage()); 
     System.exit(1); 
    } finally { //Make sure we always clean up 
     out.close(); 
     in.close(); 
     stdIn.close(); 
     socket.close(); 
    } 
} 

메소드 ClientHelper.createISO() 서버로 전송하도록되어있는 문자열을 반환한다. 불행히도 서버에 문자열이 없습니다. 문제가 프록시 설정 일 수 있습니까? 그렇다면 어떻게 해결할 수 있습니다. 아니면 내 코드에 또 다른 문제가 있습니까? 내 코드의 문제점은 무엇입니까?

+0

예외가 있습니까? 서버에서받을 수 있습니까? – Fildor

+0

당신은 예외 스택 추적을 얻는 중 오류가 무엇입니까? –

+0

서버에서 모든 문자열을 수신 한 것을 어떻게 알 수 있습니까? –

답변

1

스트림을 쓰고 나면 스트림을 플러시()해야합니다. 그렇지 않으면 전체 패킷을 얻을 때까지 소켓 버퍼

+0

사용 : out = new PrintWriter (socket.getOutputStream(), true); true는 인자기가 자동으로 플러시 될 것임을 의미합니다 – user2194528

+0

다음 중 어떤 것은 문서에서 write() 메소드를 autoflush하지 않습니다 : autoFlush - 부울; true이면 println, printf 또는 format 메서드가 출력 버퍼를 플러시합니다. – rolfl

1

아래 5 행을 확인하면 출력 스트림을 플러시해야합니다. 그렇지 않으면 서버는 어떤 패킷도 얻지 못할 것이고 당신의 첫 번째 in.readLine()이 막히기 때문에 멈추게 될 것이다.

fromUser = ClientHelper.createISO(); 
    if (fromUser != null) { 
     //System.out.println("Client - " + fromUser); 
     out.write(fromUser); 
     out.flush(); // FLUSH IT HERE, packet wont be sent until you flush your stream 
     System.out.println("Sent message"); 
    } 

또한 루프 내부에서 out.write (fromUser) 다음에 플러시를 추가하십시오.

+0

시도했지만 여전히 작동하지 않습니다. 이 소켓은 로컬 컴퓨터를 서버로 사용하는 경우에만 작동합니다. 그러나 다른 기계 인 경우 작동하지 않습니다 – user2194528

+1

클라이언트 프로그램에 "보낸 메시지"msg가 표시 되었습니까? – sverdianto

+0

"fromUser"는 콘솔에서 읽히기 전에 항상 "null"이므로 "보낸 메시지"는 절대로 인쇄되지 않습니다. try 블록에 if 문이 표시되지 않습니다. 당신은 또한 "나는 서버에서 아무런 메시지도 얻지 못했다"고 말했다. 실제로 클라이언트가 서버에 연결했는지 확인 했는가? 또한,'out.write (fromUser);와'out.flush();'전에'out.write ("\ r \ n")' – Adeeb

관련 문제