Java messenger (multithreading og swing)

stemmer
0

hei im har problemer med java messenger program. Jeg har laget en enkel gui i NetBeans og en server og klient klasse. Når jeg oppretter en ny instans av serveren i gui jeg starte en ny tråd og begynne å lytte på den. problemet oppstår når serveren får noe og går til handleConnection () der jeg ønsker å bruke setText () på en JTextPane i en annen klasse og en annen tråd (GUI). her er koden:

koden for tilkoblingsknappen i gui klasse:

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);
    }  

Serveren klasse:

/*
 * 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();
    }
}

Beklager at jeg glemte at:

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)
Publisert på 13/05/2012 klokken 09:39
kilden bruker
På andre språk...                            


3 svar

stemmer
3

Du oppretter to tilfeller av mServer, serverog ms. server's jMsger nullså jeg forventer at du får en NullPointerExceptioni runmetoden.

OPPDATER

Ta note av Marko svar om ikke å lese fra input stream på GUI tråden.

Svarte 13/05/2012 kl. 10:12
kilden bruker

stemmer
3

Det jeg ser på som en farlig idé er å lese ut av stikkontakten input stream inne i Runnableat du sender ut til hendelses Dispatch tråden. Les input stream umiddelbart i handleConnectionog bestå String til kjørbart:

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);
  }});
}
Svarte 13/05/2012 kl. 10:11
kilden bruker

stemmer
0

Jeg ønsket å kommentere på en av de andre svarene, men jeg kunne ikke finne ut hvordan du gjør det. Det er ikke så mye et svar på egen hånd, men jeg tror det er verdt å nevne, er Datainput frarådet fra hva jeg forstår på grunn av problemer med strykere og tegn. er at en stor del av et meldingsprogram stole på strengene og tegn kan det være lurt å prøve å bruke en BufferedReader stedet.

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

Håper det hjalp litt, beklager hvis jeg kommenterte på feil sted. Jeg er fortsatt å bli vant til dette nettstedet er etikette,

Svarte 22/12/2012 kl. 10:16
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more