2013-03-08 2 views
3

Java 소켓을 사용하는 데 수 백만 가지의 예제가 있습니다. 모든 클라이언트 소켓이 생성되고 일부 텍스트가 전송되고 소켓이 닫힌 것으로 표시됩니다.동일한 클라이언트 소켓을 사용하여 서버 소켓에 여러 메시지 보내기

일부 테스트 코드를 작성 중입니다. 제 클라이언트가 반복하여 메시지를 보내길 바랍니다. 매번 클라이언트 소켓을 닫고 다시 작성하는 것은 어리석은 것처럼 보입니다. 그래서 나는 하나의 클라이언트 소켓을 만들고, 루프를 반복하고 동일한 소켓에 데이터를 보낼 것이라고 생각했습니다. 문제는 - 내 서버 소켓은 클라이언트가 마지막 메시지를 보내고 클라이언트 소켓을 닫을 때까지받은 내용을 출력하지 않습니다.

서버 :

Socket sock; 
ClientConnection client; 

ServerSocket ss = new ServerSocket(portNumber); 
ss.setSoTimeout(0); // 0=infinite 

while (true) { 
    sock = ss.accept(); 
    client = new ClientConnection(sock); 
    new Thread(client).start(); 
    // ClientConnection reads from sock, prints, and closes sock 
} 

ClientConnection (서버 측에 별도의 클래스) :

public class ClientConnection implements Runnable 
{ 
    private Socket m_socket; 
    private BufferedReader m_in = null; 

    public ClientConnection(Socket socket) 
    { 
     m_socket = socket; 

     try { 
      InputStream inStream = socket.getInputStream(); 
      m_in = new BufferedReader(new InputStreamReader(inStream)); 
     } 
     catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 

    public String getMessage() 
    { 
     String line = null; 
     StringBuffer completeMessage = new StringBuffer(); 

     try { 
      while ((line = m_in.readLine()) != null) 
      { 
       completeMessage.append(line); 
      } 
     } 
     catch (IOException ioe) { 
      ioe.printStackTrace(); 
      return ""; 
     } 

     return completeMessage.toString(); 
    } 

    public void run() 
    { 
     try { 
      String message = getMessage(); 
      System.out.println("Received: " +message); 
     } 
     finally 
     { 
      try { 
       m_socket.close(); 
      } 
      catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
} 

클라이언트 :

socket = new java.net.Socket(m_destination, m_portNumber); 
outputStream = socket.getOutputStream(); 
printStream = new java.io.PrintStream(outputStream); 

while (more-stuff-to-send) 
{ 
    printStream.print(text); 
    printStream.print("\n"); 
    printStream.flush(); 
} 

prinStream.close(); 
socket.close(); 

ClientConnection이 서버에 의해 생성 내가 시작할 때 클라이언트로 전송되지만 클라이언트가 전송을 마칠 때까지 전송 된 내용은 인쇄되지 않습니다.

내가 어딘가에 줄을 따라 놓치고있는 것처럼 느껴진다. 채팅 예제는 매우 일반적입니다. 따라서 채팅 클라이언트가 있다면 채팅 서버에 보내려는 모든 메시지는 클라이언트 소켓을 만들고 메시지를 보내며 소켓을 닫습니다. 어떻게 든 옳은 것처럼 보이지 않습니다.

감사합니다.

+0

ClientConnection이 어떻게 생겼습니까? IOException을 숨길 때 소켓 스트림을 감싸는 PrintStream을 사용하지 마십시오. – jtahlborn

+0

ClientConnection 코드는이 문제를 해결하는 데 반드시 필요한 정보입니다. 아마도 SSCCE을 게시 할 수 있습니까? – Jeremy

답변

-1
client = new ClientConnection(sock); 

소켓을 생성자에 전달 중입니다.

그래서 당신은하지 말아야 : 독자를 받고 작가가, 또한 서버가 OK OK입니다 this.sock = sock; :로

socket = new java.net.Socket(m_destination, m_portNumber); 

은 생성자에서 해당 vatiable를 캐시합니다.

벡터를 사용하여 메세지를 보내기 위해 synchromized 대기열을 사용하고, while (more-stuff-to-send) 루프는 수면보다 대기열과 ID를 확인합니다. 보내야 할 것이 있으면 먼저 팝하고 물건을해야하는 동안 보냈습니다. 또는 소켓이 내 클라이언트를 닫습니다.

+1

참고, 게시 된 코드에서 명확하지 않지만 ClientConnection은 클라이언트 코드와 다른 클래스 (ClientConnection은 클라이언트에 대한 연결을 유지 관리하는 서버 쪽 클래스)라고 생각합니다. – jtahlborn

+0

@jtahlborn 고객/상사가 명확하게 그들이 다른 것을 원한다고 말하지 않는 한, 나는 그와 같이 항상하고있다. 대부분의 경우 완벽한 솔루션이며 다른 경우는 그렇지 않습니다. –

+0

클라이언트 코드와 서버 코드가 섞여 있습니다. ClientConnection 클래스는 서버 측에 있습니다. – EJP

관련 문제