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

被动侦听聊天应用程序的套接字

祁英哲
2023-03-14

我目前正在开发一个聊天应用程序,总体来说很简单,但是我在从客户端和服务器端接收字符串时遇到了问题。我使用一个线程被动地在套接字上监听传入的消息,这是我怀疑问题所在的地方。我这样做对吗?

来源:发送字符串的代码:

send.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            messageBuffer = message.getText();
            out.println(messageBuffer);
            chat.append(username + ": " + messageBuffer + "\n");
            message.setText("");
        }
    });

然后我有这个被动地听(问题可能在这里):

public void run(){
    while(true){
        try {
               messageBufferIn = in.readLine();
               System.out.println(in.readLine());
               chat.append(recipient + ": " + messageBufferIn + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我还用这个调用线程:

public static void startChatting(){
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

谢谢你能提供的任何帮助,我对线程总体来说还是新手,所以我的错误可能相当平庸。

编辑:问题是当我尝试向接收者发送消息时,没有任何通过,我可以确认它们已连接。事实上,System.out.println(in.readLine());根本不通过,甚至没有“空”输出。

共有2个答案

高嘉熙
2023-03-14

我怀疑您的主要问题是您没有刷新OutputStream。您需要添加<code>。flush()在您完成写入并想要发送消息之后。例如,您的ActionListener如下所示:

send.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        messageBuffer = message.getText();
        out.println(messageBuffer);
        out.flush();
        chat.append(username + ": " + messageBuffer + "\n");
        message.setText("");
    }
});

如果您不这样做,您的< code>OutputStream将一直保持在那里,直到它的缓冲区满了(这将会有很多消息)。

方琦
2023-03-14

>

  • 您在 Swing 中遇到并发问题,Swing GUI 不知道您在后台任务上运行/打开套接字

    Swing GUI的所有更新都必须在EDT上完成,否则什么也没发生,或者你有一些例外

    必须将所有更新从后台任务(在您的情况下为Runnable#Thread)包装到Swing GUI的的调用稍后

    而(true){是无尽循环放在那里布尔变量而不是true,那么你可以在你的情况下停止、启动或重新启动任何东西Socket

    如果send.addActionListener(new ActionListener(){只运行一次(如果用户通过JButton单击调用)然后使用SwingWoker打开Socket,SwingWorker很好地保证所有输出都应该在EDT上完成

    Runnable#ThreadSwingWorker之间的区别在于 >被指定只运行一次

  •  类似资料:
    • 问题内容: 我想构建一个Java EE应用程序(EAR),它不仅提供Web服务(WAR)或直接JMS请求(EJB),而且还希望接受套接字请求(例如UDP数据包)。 我尝试使用java.net.DatagramSocket编写侦听器,让它作为单独的进程运行,然后将请求重定向到我的EAR应用程序。 问题是..如何将这样的套接字侦听器无缝构建到Java EE(EAR)应用程序中? 谢谢。 问题答案: 在

    • 问题内容: 我想知道为数千名用户编写聊天应用程序的正确方法是什么。 我只是感到困惑,我如何才能每秒使用AJAX或更少的方法来对服务器执行ping操作,并检查MySQL中是否有新记录等,并且服务器负载可以接受。 我目前正在考虑使用jQuery,PHP和MySQL进行编码。 请指教。您的帮助将不胜感激。 问题答案: 客户端 对于需要轮询服务器的任何程序,我建议使用WebSockets。 我写了一个非常

    • 我正在使用XMPP在app引擎上编写一个聊天应用程序。我的想法是允许用户互相聊天。我可以将消息发送到google talk帐户,方法是将登录的用户删除地址的@gmail.com部分,并将其替换为@appid.appspotchat.com)。例如,如果登录的用户是bob@gmail.com,则用于发送的jid将是bob@appid.appspotchat.com)。然后,您可以将消息发送到goog

    • 现在我们已经熟悉了Socket.IO,让我们编写一个聊天应用程序,我们可以用它在不同的聊天室聊天。 我们将允许用户选择用户名并允许他们使用它们进行聊天。 首先,让我们设置我们的HTML文件来请求用户名 - <!DOCTYPE html> <html> <head> <title>Hello world</title> </head> <script src = "/s

    • 问题内容: 在我目前正在从事的项目中,我们需要开发一个Web聊天应用程序,而不是一个非常复杂的聊天,仅是一种将两个人联系起来谈论一个非常具体的话题的方式,我们不需要任何身份验证对于这两个用户之一,我们不必支持表情符号,头像或类似的东西。 一些项目成员建议我们可以通过BOSH使用XMPP,我说这就像试图用船网抓鱼,并提出了一种更简单的方法,例如简单的Ajax / MySQL网络聊天,但是我们担心性能

    • 我已经创建了一个聊天应用程序,为了完成它,我必须实现一些加密算法来保护服务器-客户端之间的消息。 我的实现是: 1.客户端创建kaypair(公钥和私钥)并将公钥发送到服务器 2.服务器获取公钥并创建用公钥加密的对称密钥 3.服务器将加密密钥发送给客户端 4.客户端使用私钥解锁对称密钥 5.客户端和服务器使用对称密钥进行通信。 这部分代码是服务器获取公钥并发送加密的对称密钥的地方 密钥加密方法: