【问题标题】:Java messenger (multithreading and swing)Java messenger(多线程和摇摆)
【发布时间】:2012-05-13 09:39:51
【问题描述】:

嘿,我在使用 java messenger 应用程序时遇到问题。我在 netbeans 和一个服务器和客户端类中制作了一个简单的 gui。当我在 gui 中创建一个新的服务器实例时,我启动一个新线程并开始在其中监听。当服务器获取某些东西并转到我想在另一个类和另一个线程(GUI)中的 JTextPane 上使用 setText()时,就会出现问题。这是代码:

gui类中连接按钮的代码:

private void doConnect(java.awt.event.ActionEvent evt) {                           

        server = new mServer(1234);
        ms = new mServer(this);
        Thread t = new Thread(server);
        t.start();
        statusLine.setText("Connection established");
    }  

服务器类:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nejc;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

/**
 *
 * @author Nejc
 */
public class mServer implements Runnable{

    private int port;

    JMessenger jMsg;

    public mServer(int port){

    this.port=port;
    }

    public mServer(JMessenger in){

        jMsg = in;
    }

    public void listen(){

        try{

            ServerSocket listener = new ServerSocket(port);
            Socket server;

            while(true){

                server = listener.accept();
        handleConnection(server);
            }

        }
    catch (IOException ioe){

            System.out.println("IOException: " + ioe);
            //ioe.printStackTrace();
            System.exit(1);
    }
    }

    protected void handleConnection(Socket server) throws IOException{

        //DataOutputStream out = new DataOutputStream(server.getOutputStream());
    final DataInputStream in = new DataInputStream(server.getInputStream());

        Runnable r = new Runnable(){

            @Override
            public void run(){

                try{

                    jMsg.field.setText("Mitja: " + in.readUTF());
                }
                catch (IOException ex){

                    Logger.getLogger(mServer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        SwingUtilities.invokeLater(r);


    //out.writeUTF(output);

        /*JTextPane field = jMsg.field;
        String mssg = in.readUTF();
        field.setText(mssg);
        * 
        */

    server.setKeepAlive(true);
    }

    @Override
    public void run(){

        listen();
    }
}

对不起,我忘记了:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.nejc.mServer$1.run(mServer.java:70)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

【问题讨论】:

  • 你有什么问题?有什么例外吗?
  • 所以用户不是读心者。请提及您的问题。
  • 另见Echo

标签: java multithreading swing messenger


【解决方案1】:

您正在创建两个 mServer 实例,servermsserverjMsgnull 所以我希望你在 run 方法中得到一个 NullPointerException

更新

注意 Marko 关于不在 GUI 线程上从输入流中读取的回答。

【讨论】:

  • server 不是null: server = listener.accept(); handleConnection(server);
  • 我说server实例中的变量jMsgnull。可能应该有一个 mServer 的实例,其构造函数同时使用端口和 JMessenger
  • OP:“当服务器获取某些东西并转到handleConnection()时会出现问题”
  • 对,handleConnection 创建了一个 Runnable 的匿名实例,该实例有一个 run 方法,该方法试图取消引用 jMsg,这将是 null,因此我希望 NullPointerException 是被抛出。
  • 男孩,那是混乱的代码。当他解决了这个问题时,他会遇到更多的问题。但无论如何,他没有响应添加 exc 堆栈跟踪的请求,所以为什么还要麻烦,真的。
【解决方案2】:

我认为一个危险的想法是从Runnable 内的套接字输入流中读取您要发送到事件调度线程的内容。立即在handleConnection 中读取输入流并将String 传递给runnable:

protected void handleConnection(Socket server) throws IOException{
  final String s = new DataInputStream(server.getInputStream()).readUTF();
  SwingUtilities.invokeLater(new Runnable(){ public void run() {
    jMsg.field.setText("Mitja: " + s);
  }});
}

【讨论】:

  • 这是一个很好的建议,但它仍然无法解决他可能看到的异常。
  • 我应该在回答中重复您的建议吗?我认为我把那部分留给你是公平的。现在让我们删除彼此的反对票并握手。
  • +1,我喜欢这个想法,关于获取输入并将值传递给 EDT :-)
  • @nIcE cOw 在所有情况下,您都可以避免将 try - catch - finally 块放入 invokeLater() 中
  • @mKorbel 是的,如果在任何地方,try-catch 现在应该与 readUTF() 保持一致。该方法已经在声明IOException
【解决方案3】:

我想对其他答案之一发表评论,但我不知道该怎么做。它本身并不是一个答案,但我认为值得一提的是,由于字符串和字符的问题,我所理解的 DataInputStream 已被弃用。由于消息传递应用程序的很大一部分依赖于字符串和字符,因此您可能想尝试使用 BufferedReader。

 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

希望对您有所帮助,如果我在错误的地方发表评论,请见谅。我还在习惯这个网站的礼仪,

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多