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 是在我启动客户端时由服务器创建的,但在客户端完成发送之前它不会打印已发送的内容。

我觉得我错过了沿线的某个地方。聊天示例很常见,所以如果我有一个聊天客户端,那么它想要发送到聊天服务器的每条消息都会创建一个客户端套接字,发送消息,然后关闭套接字?只是在某种程度上似乎不对。

谢谢你。

4

1 回答 1

-1
client = new ClientConnection(sock);

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

所以你不应该这样做:

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

只需将来自构造函数的变量缓存为:this.sock = sock; 获取阅读器和编写器就可以了,服务器也可以。

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

于 2013-03-08T19:18:18.193 回答