java - 被动监听聊天应用程序的套接字

标签 java swing sockets concurrency event-dispatching

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

来源: 发送字符串代码:

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());根本没有通过,甚至没有“空”输出。

最佳答案

  1. 您遇到了 Concurency in Swing 问题,Swing GUI 不知道您在 后台任务 上运行/打开 Socket

    <
  2. Swing GUI 的所有更新都必须在 EDT 上完成,否则什么也不会发生,或者您会遇到一些异常

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

  4. while(true){ 是无限循环,把 Boolean variable 而不是 true,然后你可以停止,开始或根据您的情况重新启动 Socket

  5. send.addActionListener(new ActionListener(){ 仅运行一次的情况下(如果用户通过 JButtons 单击调用)则使用 SwingWoker打开 Socket,SwingWorker 很好的保证了所有的输出都应该在 EDT 上完成

  6. Runnable#ThreadSwingWorker 的区别在于 SwingWorker 被指定为只运行一次

    <

关于java - 被动监听聊天应用程序的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090378/

相关文章:

java - isArmed、isPressed 和 isSelected 之间的区别

java - swing 组件的名称属性是什么?

Java - 添加/删除 JPanel 类

ios - 在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

java - 如何将下载的文件保存在应用程序内存的缓存文件夹中?

java - 我如何告诉 HtmlUnit 的 WebClient 下载图像和 css?

java - 从字符串中删除非 ASCII 不可打印字符

java - Thread.join 卡住进度条

Node.js Socket 管道方法不会将最后一个数据包通过管道传输到 http 响应

spring - 是否有任何 spring 集成 tcp-inbound-channel-adapter 示例?