按钮点击事件与服务器信息交换的冲突问题

项目需要要求编写一个qq聊天室,通过点击好友打开,但如果将调出聊天界面的方法写入按钮的点击事件,就会在点击按钮后卡死,聊天界面无法显示并且服务器连接不了,不过直接运行聊天界面就能正常运行。
问题相关代码,请勿粘贴截图

测试的按钮类

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class test2 {
       
    public static void main(String []args) {
        JFrame jf2 = new JFrame("测试");
        jf2.setBounds(630,230,300,100);
        JButton jb = new JButton("确定");
        jb.setBounds(0, 0, 100, 50);
        
        jb.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自动生成的方法存根
                chatPane cp = new chatPane("","");
                cp.run() ;
            }
        });
        
        jf2.add(jb);
         jf2.setVisible(true);
         jf2.setResizable(false);
        
    }

    
}

聊天面板chatPane类

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class chatPane  {
    private static JTextArea jta;
    private static JTextField jtf;
    private static JButton send;
    private static JPanel topPane;//顶部面板
    private static JPanel middlePane;//中部面板
    private static String ownerID;
    private static String person;
    private static Socket socket;
    private String chatServer;
    private static InputStreamReader reader ;
    private static BufferedReader buffer_reader ;
    private static PrintWriter writer ;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    private static String msg=null;

    
    private static final String IMAGE_PATH = "C:\\JAVA\\EndOfFermQQ\\src\\Test1\\picture\\";
    public chatPane(String ownerID,String person) {
        
        this.ownerID = ownerID;
        this.person = person;
        
    }
    public static void main(String []args) {
        chatPane cp = new chatPane("","");
        cp.run();
    }
    synchronized public  static void run() {
        System.out.println("开始构建聊天界面");
        init();
    }
    synchronized public static void init() {
        JDialog jf = new JDialog(new JFrame(), "qq",false);
        topPane = createTopPane();
        middlePane = creatMiddlePane();
        
        jf.add(topPane);
        jf.add(middlePane);
        jf.setSize(599, 666);
        jf.setLocation(670, 213);
        jf.setVisible(true);
        jf.setResizable(false);
        
        runClient();
    }
    
    //创建面板
    public static  JPanel createTopPane() {
        topPane = new JPanel();
        topPane.setLayout(null);
        topPane.setBounds(0, 0, 599, 483);
        JLabel out = new JLabel("其他功能");
        out.setBounds(0, 0, 599, 43);
        
        
        jta = new JTextArea();
        jta.setBounds(0,43, 599, 440);
        
        topPane.add(out);
        topPane.add(jta);
//        topPane.add(select);
        return topPane;
    }
    public static JPanel creatMiddlePane() {
        middlePane = new JPanel();
        middlePane.setLayout(null);
        middlePane.setBounds(0, 483, 599, 145);//102,,43
        JLabel select = new JLabel("功能选择");
        select.setBounds(0, 483, 599, 42);
        
        
        JLabel go = new JLabel("fas");
        go.setBounds(0,575,599,43);
        jtf = new JTextField();
        jtf.setBounds(0, 525, 599, 60 );//60
        send = new JButton("发送", new ImageIcon(getImagePath("send.png")));
        send.setBounds(497, 591, 72, 28);
        send.setFont(new Font("宋体", Font.BOLD, 15));
        send.setForeground(new Color(255, 255, 255));
        send.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // 将鼠标设置为手掌型
        send.setContentAreaFilled(false);
        send.setFocusPainted(false);
        send.setBorderPainted(false); // 取消按钮的边框
        send.setFocusPainted(false); // 消除按钮的焦点,即点击按钮时不出现边框
        send.setVerticalTextPosition(SwingConstants.CENTER);
        send.setHorizontalTextPosition(SwingConstants.CENTER);
        //实现一个监听对象
        send.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自动生成的方法存根
                String text = jtf.getText();
                sendData(jtf.getText());
                jtf.setText("");
            }
        });

        middlePane.add(send);
        middlePane.add(select);
        middlePane.add(jtf);

        return middlePane;
    }
    //获取图片
    private static String getImagePath(String imageName) {
        if (imageName == null || imageName.trim().length() == 0) {
            throw new RuntimeException("图片名称不能为空");
        }
        return IMAGE_PATH + imageName;
    }
    
    //启动客户端
        private static void runClient()   {
            try {
//                connectServer();
                //获取链接
                getStream();
                System.out.println("成功获取链接");
                //链接成功进行聊天
                communication();
                System.out.println("链接成功");
                
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }finally {
                try {
                    closeConnection();
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }
        //和服务器进行链接
//        private static void connectServer() {
//            // TODO 自动生成的方法存根
//            
//            
//        }
        //获取链接
        private static void getStream() throws IOException {
            // TODO 自动生成的方法存根
            displayMessage("尝试链接.........\n");
            try {
                socket = new Socket("192.168.2.201",8888);
                System.out.println("和服务器链接");
//                socket.setSoTimeout(3000);
                displayMessage("链接成功:"+socket.getInetAddress().getHostAddress());
            } catch (UnknownHostException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                displayMessage("链接失败");
                e.printStackTrace();
            }
            
            reader = new InputStreamReader(socket.getInputStream());
            buffer_reader = new BufferedReader(reader);
            writer = new PrintWriter(socket.getOutputStream());
            String info = null;
            while((info = buffer_reader.readLine())!=null) {
                displayMessage("\n服务器说:"+info);
            }
            
            
            writer.println("测试发送");
            System.out.println("测试发送成功");
            writer.flush();
            writer.flush();
            
        }
        //链接成功进行聊天
        private static void communication()   {

            // TODO 自动生成的方法存根
            setTextFieldEditable(true);
            char[] ch = new char[1024] ;
            
            try {
                System.out.println("陷入循环");
                while((msg = buffer_reader.readLine())!=null) {
                    System.out.println("msg:"+msg);
                }
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
//            do {
//                    System.out.println("陷入循环");
//                        
//                            
//                                try {
//                                    msg = buffer_reader.readLine();
//                                    System.out.println("msg:"+msg);
//                                } catch (IOException e) {
//                                    // TODO 自动生成的 catch 块
//                                    e.printStackTrace();
//                                }
//                                
//                        displayMessage("\n"+msg);
//                System.out.println("下一次聊天之前");
//            }while(msg!=null) ;
            if(msg!=null) {
                displayMessage("\n"+msg);
            }
                
            
            
            
        }
        //关闭链接
        private static void closeConnection() throws IOException {
            // TODO 自动生成的方法存根
//            setTextFieldEditable(false);
            
            writer.close();
            buffer_reader.close();
            socket.close();
        }
        //将信息展示在消息栏
        private static void displayMessage(final String msg) {
            SwingUtilities.invokeLater(new Runnable() {
                
                @Override
                public void run() {
                    // TODO 自动生成的方法存根
                    jta.append(msg);
                    jta.setCaretPosition(jta.getText().length());
                }
            });
        }
        //发送数据
        private static void sendData(String msg) {
                //String ownerID,String person
                try {
                    writer = new PrintWriter(socket.getOutputStream());
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                writer.println("+ownerID+"'  to='"+person+"'  message='"+msg+"'>");
                writer.flush();
                displayMessage("\n ownerID:"+msg);
                
        }
        
        private static void setTextFieldEditable(final boolean b) {
            // TODO 自动生成的方法存根
            SwingUtilities.invokeLater(new Runnable() {
                
                @Override
                public void run() {
                    // TODO 自动生成的方法存根
                    jtf.setEditable(b);
                }
            });
        }


}

服务器类

import java.net.ServerSocket;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.io.*;
import java.net.*;
public class Server {

    public static void main(String[] args) throws IOException{
        // TODO 自动生成的方法存根
        ServerSocket server = new ServerSocket(8888);
        Vector vector =new Vector<>();
        ExecutorService es = Executors.newFixedThreadPool(6);
        while(true) {
            Socket socket = server.accept();
            SocketHandler handler = new SocketHandler(socket,vector);
            Thread thread = new Thread(handler);
            es.execute(thread);
        }
    }

服务器的多线程类

import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import java.io.*;
public class SocketHandler implements Runnable{
    private static   String loginName;
    private static Socket socket;
    private static Vector vector;//客户端处理线程的集合
    private InputStreamReader reader;
    private PrintWriter writer;
    public static String order;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    
    public SocketHandler(Socket socket,Vector vector) {
        this.socket = socket;
        this.vector=vector;
        vector.add(this);
    }
    
    public void run() {
        try {
            reader = new InputStreamReader(socket.getInputStream());
            BufferedReader buffer_reader = new BufferedReader(reader);
            writer = new PrintWriter(socket.getOutputStream());
            String request = null;
            
            while((request = buffer_reader.readLine())!=null) {
                System.out.println("客户端说"+request);
                System.out.println("来自Cilent的信息已经收到");
                String order = "你好,我是服务器";
                writer.println(order);
                writer.flush();
                System.out.println("已经将反馈信息发出");
            }
        writer.close();
        buffer_reader.close();
        socket.close();    
        
        System.out.println("该进程已经结束");
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        
    }

    public static String getName(String despose) {
        String name = "";
        for(int i = 0;iif(despose.charAt(i)!=' '){
                    name+=despose.charAt(i);
        }
            else {
                break;
            }
        }
        name = name.replace("'", "");
        return name;
    }
}

运行结果及报错内容

通过按钮打开的页面:

img

就一直卡死在这里

我的解答思路和尝试过的方法

经过调试发现程序运行到读取信息的死循环那里就卡住了

我想要达到的结果

我就想知道循环读取信息这个操作为什么会和按钮的点击事件发生冲突,不能通过直接创建chatPane的实例对象来调用,而是要单独为chatPane这个窗口开一个新的线程才能运行

在test类里的加的监听改成这样试试看
new Thread(new Runnable() {
@Override public void run() {
chatPane cp = new chatPane("","");
cp.run() ;
}

            }).start();