当前位置: 首页 > 知识库问答 >
问题:

使用同一个客户端套接字向服务器套接字发送多条消息

贺卜霸
2023-03-14

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

我觉得我错过了这条线的某个地方。聊天示例非常常见,所以如果我有一个聊天客户端,那么它想发送给聊天服务器的每条消息都会创建一个客户端套接字,发送消息,然后关闭套接字?只是看起来有点不对劲。

谢谢你。

共有1个答案

赵钊
2023-03-14
client = new ClientConnection(sock);

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

所以你不应该这样做:

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

只需将constructor提供的梵蒂冈缓存为:this。袜子=袜子 读取和写入都正常,服务器也正常。

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

 类似资料:
  • 我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我对Android系统是新手。我有一个客户端类,我的主要活动引用。client类将客户端套接字连接到充当服务器的外部设备,但是它从不将我试图发送的消息发送到服务器。我知道这不是连接,因为在创建套接字时,我将setKeepAlive()设置为true,当我试图发送消息时不会引发异常,socket.isconnected()返回true,如果我试图在发送消息之前连接套接字,它会引发“已经连接”的异常。

  • 我最近开始学习php套接字。我想在服务器和客户端之间创建一个永久传输控制协议!但是我的PHP套接字客户端只发送和接收一条消息。我想无限期地发送和接收消息,通过一个连接。 服务器php: 客户php:

  • 我用Java编写了套接字客户端程序。我正在使用DataOutputStream向服务器套接字发送消息。有时DataOutputstream上的writed消息不会发送到ServerSocket。我想是因为我发了信息后没有脸红。我这样做,但没有用。如果我终止类执行,那么只有我从ServerSocket接收消息。 我的代码: 已完成将消息放入队列。无限while循环将负责向服务器套接字发送日志。 文件