2013-03-08 84 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

客户端连接看起来像什么?注意,从不使用包装在Socket流中的PrintStream,因为它隐藏IOExceptions。 – jtahlborn 2013-03-08 19:20:49

+0

ClientConnection代码是解决此问题的必要信息。也许你可以发帖SSCCE? – Jeremy 2013-03-08 19:34:31

回答

-1
client = new ClientConnection(sock); 

您在构造函数中传递套接字。

所以你不应该这样做:

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

只是缓存是vatiable从构造器如:this.sock = sock; 让读者和作者是确定的,也是服务器就可以了。

我会使用一个Vector作为发送消息的同步队列,并且while (more-stuff-to-send)循环会检查队列和id,而不是睡眠,如果有东西要发送,比弹出第一个并发送它,而他必须做的东西,或者套接字关闭我的客户端。

+1

请注意,从发布的代码中并不明显,但我相信ClientConnection与包含的“客户端代码”是不同的类(ClientConnection是维护与客户端的连接的服务器端类)。 – jtahlborn 2013-03-08 19:54:20

+0

@jtahlborn对我来说很明显,除非客户/老板明确表示他们想要别的东西,否则我会一直这样做。在大多数情况下,这是一个完美的解决方案,其他案例不是 – 2013-03-08 21:54:09

+0

您正在混合客户端代码和服务器代码。 ClientConnection类在服务器端。 – EJP 2015-01-07 06:05:14

相关问题