2010-08-01 3 views
3

다음은 코드입니다.첫 번째 네트워킹 프로그램에 대한 도움말

public class testClient { 
public static void main(String[] args) { 
    testClient abc = new testClient(); 
    abc.go(); 
} 
public void go() { 
    try { 
     Socket s = new Socket("127.0.0.1", 5000); 
     InputStreamReader sr = new InputStreamReader(s.getInputStream()); 
     BufferedReader reader = new BufferedReader(sr); 
     String x = reader.readLine(); 
     System.out.println(x); 
     reader.close(); 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

public class testServer { 
public static void main(String[] args) { 
    testServer server = new testServer(); 
    server.go(); 
} 
public void go() { 
    try { 
     ServerSocket s = new ServerSocket(5000); 
     while(true) { 
      Socket sock = s.accept(); 

      PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
      String toReturn = "No cake for you."; 
      writer.println(toReturn); 
     } 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

java.io.*java.net.*는 두 클래스에서 가져옵니다.

이제 다른 터미널을 사용하여 실행하려고하면 아무 일도 일어나지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

화면 : http://i29.tinypic.com/250qlmt.jpg

+2

텔넷으로 서버를 사용할 수 있습니까? 'telnet localhost 5000'이 알려줄 것입니다. 그런 다음 한 번에 절반 만 디버깅하면됩니다. –

+0

(양쪽 모두의 문자 인코딩이 무엇이든 상관 없지만, UTF-8 같은 인코딩을 명시 적으로 지정하는 것이 훨씬 더 효과적이며,'PrintWriter'도 예외를 처리하므로 다른 'Writer'). –

답변

5

PrintWriter를 사용할 때 flush 메서드를 호출해야합니다. 코드를 다음과 같이 변경하면 작동합니다 :).

public class testServer { 
public static void main(String[] args) { 
    testServer server = new testServer(); 
    server.go(); 
} 
public void go() { 
    try { 
     ServerSocket s = new ServerSocket(5000); 
     while(true) { 
      Socket sock = s.accept(); 

      PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
      String toReturn = "No cake for you."; 
      writer.println(toReturn); 
      writer.flush(); 
     } 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 
5

귀하의 출력이 분명히 버퍼링. 당신의 출력을 작성 후, 플러싱 시도 :

 writer.println(toReturn); 
     writer.flush(); 

또한, 당신은 당신이 소켓으로 수행하는 경우 서버에 sock.close()를 호출 고려할 수있다, 그렇지 않으면 클라이언트는 남아있을 것입니다 다음에 무엇을 궁금해.

+0

Writer.close()가 더 중요 할 것입니다. flush()를 수행하기 때문입니다. – EJP

+0

PrintWriter.close()와 같은 것을 호출하면 기본 OutputStream을 닫을 지 여부를 결코 기억할 수 없습니다. –

+0

그렇지만,'PrintWriter'를 성공적으로 만들어야 만합니다. 어쨌든 (해피 케이스에서 데코레이터에 플러시를 주어야만하는) 기반 스트림을 닫을 수도 있습니다. 소켓의 경우, 스트림 중 하나를 닫으면 기본적으로 소켓이 실제로 닫힙니다. –

1

이 간단한 작업 예제를 확인하십시오.

import java.net.*; 
    import java.io.*; 
    public class Server { 
     Server() throws IOException { 
      ServerSocket server = new ServerSocket(4711); 
      while (true) { 
       Socket client = server.accept(); 
       InputStream in = client.getInputStream(); 
       OutputStream out = client.getOutputStream(); 
       int multiplikator1 = in.read(); 
       int multiplikator2 = in.read(); 
       int resultat = multiplikator1 * multiplikator2; 
       out.write(resultat); 
     } 
     public static void main (String[] args) { 
     try { 
     Server server = new Server(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

    import java.net.*; 
    import java.io.*; 
    public class Client { 
     Client() throws IOException { 
      Socket server = new Socket ("localhost", 4711); 
      InputStream in = server.getInputStream(); 
      OutputStream out = server.getOutputStream(); 
      out.write(4); 
      out.write(9); 
      int result = in.read(); 
      System.out.println(result); 
      server.close(); 
     } 
     public static void main (String[] args) { 
      try { 
      Client client = new Client(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    } 
1

작가를 닫습니다.

관련 문제