2016-09-16 74 views
0

我有一个名为ServerJFrame,它拥有一个带有TextArea的套接字服务器作为控制台。每个连接的客户端创建一个名为clientThread的新线程。如何获取当前运行的类作为对象?

我的问题是:clientThread如何将一个字符串追加到服务器中的TextArea中。我想通过跑步课程作为参数,但我不知道如何做到这一点。有任何想法吗?

客户端线程:

public class ClientThread extends Thread{ 
    Socket clientSocket; 
    int ClientID = -1; 
    boolean running = true; 
    BufferedReader in; 
    PrintWriter out; 
    Server console; 

    public ClientThread(Socket s,int id,Server obj) throws IOException{ 
     clientSocket=s; 
     ClientID=id; 
     console=obj; 
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     out = new PrintWriter (new OutputStreamWriter(clientSocket.getOutputStream())); 
    } 

服务器:

public class Server extends javax.swing.JFrame { 

    /** 
    * Creates new form Server 
    */ 
    public Server() { 
     initComponents(); 
    } 

    static public void writeToConsole(String s) { 
     jTextArea1.append(s); 
    } 

    public static void main(String args[]) { 

     try { 
      ServerSocket servSocket = new ServerSocket(8008); 
      writeToConsole("Server Started\n"); 
      int clientID = 1; 
      while (true) { 
       Socket clientSocket = servSocket.accept(); 
       //Pass this class to the ClientThread As object?? 
       ClientThread clientThread = new ClientThread(clientSocket, clientID++, (theObjectOfThisClass)) 
       ); 
        clientThread.start(); 
      } 

      /* Create and display the form */ 
      java.awt.EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        new Server().setVisible(true); 
       } 
      }); 
     } catch (IOException ex) { 
      Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

编辑:固定ClientThread构造

+0

你在找'this'吗? – chrylis

+0

@chrylis啊是这个关键字的作品,但是这个类是非静态的,这个语句在主要方法中。有任何想法吗? –

+0

我很困惑你如何创建线程。这发生在一个无限循环中,所以即使你想出如何发送'JFrame'的实例给每个线程,你仍然不会显示窗口。 –

回答

1

可以作为参数添加ServerClientThread构造:

public ClientThread(Socket s,int id,ServerConsole obj, Server server) 

虽然,从另一个线程修改GUI时要小心。您需要创建一个Runnable以在SwingUtilities的主UI线程上运行。您可以使用runAndWait()runLater()

如您所知,main()是静态的,因此没有this参考。相反,您已在创建Server实例new Server()后来在main()。您需要尽快创建此对象并存储对它的引用,以便您可以随时随地使用它。

编辑:

我心目中是这样的:

public static void main(String args[]) { 
    Server server = new Server(); 
    ClientThread clientThread = new ClientThread(clientSocket, clientID++, server); 
    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     server.setVisible(true); 
    } 
}); 
    } 

注意,因为你只想要一个窗口中,您应该只做一次new Server()。在使用它之前,你必须这样做来初始化变量,否则参考将会是null,这会导致更多的问题。

+0

是的。我知道这一部分。我想知道在这里做什么? ClientThread clientThread = new ClientThread(clientSocket,clientID ++,(theObjectOfThisClass))); –

+0

@RenierSwart你需要一个对'Server'对象的引用。最简单的方法是在循环之前创建它,然后稍后重复使用同一个实例来调用'setVisible(true)'。不过,我认为你会遇到其他问题,因为while循环是无限的。 –

+0

这可能工作,身份证给了一个尝试,让你知道。 –

-1

好吧,我设法解决这个问题。对于同样的问题,这里的任何人是如何解决它:

创建一个局部变量到当前类:

static Server svr; 

在类的构造函数(通过服务器OBJ本身)

public Server(Server server) { 
     initComponents(); 
     svr=server; 
    } 

当GUI调用被调用时,发送创建的变量的地方OBJ:

java.awt.EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        new Server(svr).setVisible(true); 
       } 
      }); 

感谢Code Apprentice的创意。

+0

将服务器传递给服务器构造函数的目的是什么?你有多个窗户?为什么变量是静态的? –

+0

这对ClientThread有什么帮助? –

+0

将服务器传递给服务器构造函数的目的是让当前正在运行的类能够发送到ClientThread,这将不会创建多个服务器窗口,并且它是静态的,因为服务器是在公共静态void main中创建的。它允许客户端发送的数据被ClientThread接收并显示在服务器的文本区域中。 –

相关问题