0

嘿,我在使用 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)
4

3 回答 3

3

我认为一个危险的想法是从Runnable您发送到事件调度线程的套接字输入流中读取。立即读取输入流handleConnection并将字符串传递给可运行对象:

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);
  }});
}
于 2012-05-13T10:11:54.610 回答
3

您正在创建 mServer 的两个实例,server并且ms. server'sjMsg所以null我希望你得到一个NullPointerException方法run

更新

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

于 2012-05-13T10:12:20.997 回答
0

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

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

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

于 2012-12-22T10:16:05.733 回答