Java 如何通过套接字传递带有jTable的jFrame?

Java 如何通过套接字传递带有jTable的jFrame?,java,sockets,jtable,client-server,jframe,Java,Sockets,Jtable,Client Server,Jframe,我有一个客户机-服务器应用程序,在客户端我有一个接收帧的按钮 从服务器将表放在其中。 如果我将框架与其他jComponents(JButton,JTextField)一起传递,它工作得很好,但是当我 尝试用jTable传递帧时,客户端出现null异常 这是我的密码: 客户端: private class GetServerData extends Thread { String server_msg = " "; Socket the_client; ObjectInpu

我有一个客户机-服务器应用程序,在客户端我有一个接收帧的按钮 从服务器将表放在其中。 如果我将框架与其他jComponents(JButton,JTextField)一起传递,它工作得很好,但是当我 尝试用jTable传递帧时,客户端出现null异常

这是我的密码:

客户端:

private class GetServerData extends Thread
{
    String server_msg = " ";
    Socket the_client;
    ObjectInputStream from_server;

    public GetServerData(Socket client)
    {
        the_client = client;
        try {
            from_server = new ObjectInputStream(the_client.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() 
    {
        do {
            try {
                Object obj = from_server.readObject(); // this is the line when the exception reference to 
                                                       // when trying to read the JFRAME 
                if (obj instanceof JFrame) {
                    JFrame window = (JFrame)obj;
                    window.setVisible(true);
                    window.pack();
                }
                else {
                    server_msg = (String)obj;
                    System.out.println(server_msg);
                }
            }
            catch (ClassNotFoundException | IOException e) {
                e.printStackTrace();
            }
        }while(!server_msg.equals("bye"));
    }
}
服务器端:

public void run(){
    while (true){
        try {
            data_from_client = (Vector)from_client.readObject();
            if (data_from_client.elementAt(0)equals("string")) {
                String s = "Hello user";
                to_client.writeObject(s);
                to_client.flush();
            }                   
            else if (data_from_client.elementAt(0).equals("table")) {
                String [][]d = {{"yoyo","jojo"},{"koko","momo"}}; 
                String []h   = {"name","best friend"};
                JTable jtable = new JTable(d,h);
                JScrollPane scroll = new JScrollPane(jtable);
                JPanel panel = new JPanel();
                panel.add(scroll,BorderLayout.CENTER);
                JFrame frame = new JFrame("Im from the server!!");
                frame.add(panel);
                to_client.writeObject(frame);
                to_client.flush();
            }
            //else if (data_from_client.elementAt(0).equals("bye")) {
            //    to_client.println("bye");
            //    to_client.flush();
            //    socket.close();
            //    socket = null;
            //}
        }
        catch(IOException | ClassNotFoundException ioe) {
            break;
            // error in reading streams from client
        }
    }
    close();
}
例外情况是:

Exception in thread "Thread-21" java.lang.NullPointerException
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.access$300(Unknown Source)
at java.io.ObjectInputStream$GetFieldImpl.readFields(Unknown Source)
at java.io.ObjectInputStream.readFields(Unknown Source)
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.access$300(Unknown Source)
at java.io.ObjectInputStream$GetFieldImpl.readFields(Unknown Source)
at java.io.ObjectInputStream.readFields(Unknown Source)
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.access$300(Unknown Source)
at java.io.ObjectInputStream$GetFieldImpl.readFields(Unknown Source)
at java.io.ObjectInputStream.readFields(Unknown Source)
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.access$300(Unknown Source)
at java.io.ObjectInputStream$GetFieldImpl.readFields(Unknown Source)
at java.io.ObjectInputStream.readFields(Unknown Source)
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.access$300(Unknown Source)
at java.io.ObjectInputStream$GetFieldImpl.readFields(Unknown Source)
at java.io.ObjectInputStream.readFields(Unknown Source)
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.access$300(Unknown Source)
at java.io.ObjectInputStream$GetFieldImpl.readFields(Unknown Source)
at java.io.ObjectInputStream.readFields(Unknown Source)
at java.awt.Container.readObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at pack.connect_to_server.ServerConnection$GetServerData.run(ServerConnection.java:92)
我已经在发生异常的客户端发表了评论。

通过
序列化传递JFrames(或任何窗口)是个坏主意,根据我的经验,这似乎归结为它与系统本地对等方的连接,一旦传输,就会丢失,通常会导致许多严重问题,以我的经验

我可能会错过非常明显的,有些已经克服了这些限制,但我还没有发现


如果可以,您应该只传输数据内容,这样通常更安全,也不会太混乱;)

将GUI对象发送到服务器没有什么好处,也没有什么坏处。正如MadProgrammer所说,您应该向服务器发送数据和数据,并将GUI端留给GUI程序。。。因此,与其发送jframe本身,不如将其保存在xml文件中,然后将该文件发送到客户端。。在客户端填充数据,然后构建框架?@eliorsh这是一个稍微好一点的主意,就我个人而言,我只打包您要在客户端复制的数据,而不打包restok谢谢!我还在其他线程中读到,有人建议将所有数据(如jbutton、jtextfield)添加到jpanel,并将jpanel发送到客户端。。你觉得怎么样?这里是线索:问题是您可能会遇到与UI相关的各种子元素相关的随机问题。一般来说,只发送数据会减少问题,但这是您的选择