2013-07-15 3 views
1

저는 약간의 초보 프로그래머이기 때문에 이것은 매우 명백 할 수 있으며 대답을 간과 할 수 있습니다. 그러나 질문에.소켓 연결을 통해 여러 메시지를 보내는 것을 처리하는 방법은 무엇입니까?

두 가지 부분으로 구성된 프로그램 (이 예제보다 약간 복잡하지만 상황은 동일합니다)이 있습니다. 이 프로그램에는 클라이언트와 서버간에 여러 메시지가 실행됩니다. 서버 측에서 PrintWriter를 사용하여 클라이언트에게 메시지를 보내고, 클라이언트에는 보낸 메시지를 읽는 BufferedReader가 있습니다. 이 예제를 실행하면 두 줄이 출력됩니다. 첫 번째 메시지는 두 메시지이고 두 번째 메시지는 NULL입니다. 내가 궁금해하는 점은 두 번째 메시지가 준비되기 전까지 기본적으로 서버를 중지 할 수있는 방법이 있는지, 두 번째 메시지를 보내기 전에 클라이언트 측에서 처리 할 수있는 방법이 있는지 궁금합니다.

Thread.Sleep을 사용하지 않기를 바란다. Client가 준비가 될 때까지 Server가 기다려야하므로.

public class Client{ 
public void run(){ 
    Socket socket = null; 
    InputStream in = null; 
    BufferedReader reader = null; 

    try{ 
     socket = new socket("LocalHost",1234); 
     in = socket.getInputStream(); 
     reader = new BufferedReader(new InputStreamReader(in));   
    } 

    String messageFromServer = ""; 
    try{ 
     messageFromServer=reader.readLine(); 
    } 

    System.out.println(messageFromServer); 

    String messageFromServer = ""; 

    try{ 
     messageFromServer=reader.readLine(); 
    } 
    System.out.println(messagefromServer); 

    //close everything 
} 

}

이 서버입니다 :

public class Server{ 
    public void run(){ 
     ServerSocket server = null; 
     Socket client = null; 
     try{ 
      server = new ServerSocket(1234); 
      client = server.accept(); 
     } 

     PrintWriter writer = null; 
     OutputStream out = null; 

     try{ 
      out = client.getOutputStream(); 
      writer = new PrintWriter(out, true); 
     } 

     writer.write("Hi I'm a server"); 

     //do some stuff that takes some time, user input, etc. etc. 

     writer.write("I'm still a server"); 

     //close everything 
    }  

감사합니다 :)

+0

당신의 클라이언트가 ACK 메시지를 보낼 수있는 메시지를 얻을 것이다, 서버 스레드는 다른 메시지를 보내기 전에 기다립니다. – vidit

+0

풀링 메커니즘을 사용하여 클라이언트가 서버를 폴링하도록 허용 – MadProgrammer

+0

그래서 Thread.Sleep을 사용하지 않고 서버를 ""절전 "으로 만들고 싶습니까? –

답변

0

당신은 객체가 아닌 문자열을 읽을 수 ObjectInputStream을 사용할 수는

는 클라이언트입니다 .
이 방법을 사용하면 ObjectInputStream.readObject()에 대한 모든 호출을 하나의 Message (String)로 읽을 수 있습니다.

처음에는 "할 일"을 읽고 두 번째 메시지를 읽을 수 있습니다. 보낸 메시지를 모두 읽을 필요가 없습니다.
다른 메시지가없는 경우 ObjectInputStream에서 객체를 읽으려고하면 스레드가 차단됩니다.
이 좋아 사용
ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream())

+1

좋은 조언, 그게 어떻게 도움이됩니까? – MadProgrammer

+0

@MadProgrammer 나는 내 대답을 편집했다 : – m1o2

+0

거기 훨씬 더;) – MadProgrammer

0

문제를 당신은 당신의 코드를 가지고있는 방법을 당신이 BufferedReader를 사용하지만, 서버가 새로운 라인 메시지의 종료되지 않는다는 사실이다. 당신이 뭔가를 할 경우

당신이 writer 닫습니다

, 클라이언트는 ...

... EOF 또는 EOS에 도달하고 두 문자열은 한 번에 전송되는 것으로 나타나도록 읽기 차단을 해제한다

writer.write("Hi I'm a server\n"); 
// This will force the message to be written to the client and picked up ;) 
writer.flush(); 
writer.write("I'm still a server\n"); 
writer.flush(); 

그럼 당신은 각각 따로 ...

+0

완벽, 나는 그것이 내가 바라보고 있었던 무엇인가 명백했다라고 상상했다. 리더가 읽지 않고도 개행 문자를 쓸 수있는 방법이 있습니까? –

+0

예, 독자의 콘텐츠를 수동으로 읽어야합니다 ... – MadProgrammer

관련 문제