燃烧的钥匙 2019-11-08 11:37
浏览 403

Java swing多线程实现聊天程序阻塞问题

1、在用swing写一个能够动态添加客户端的socket通信程序,即服务端用
一个异步线程持续监听新的客户端连接,如果有新的连接就新建一个客户端线
程来监听客户端,接收或者发送给客户端信息。

//这是监听客户端连接的线程:
 new Thread(new Runnable() {
                        @Override
                        public void run() {
//                            异步线程持续监听端口连接
                            while (true){
                                if (server.isClosed()){
//                              服务器一旦关闭,就跳出循环
                                    break;
                                }
                                Socket temp = null;
                                try {
                                    temp = server.accept();
                                    JOptionPane.showMessageDialog(null,"连接建立成功,客户端端口号为:" +temp.getPort());
//                                      为每一个连接建立一个异步线程
                                    Connection con = new Connection(temp);
                                    con.start();
                                    connections.add(con);
                                    sockets.add(temp);
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                            }
                        }
                    }).start();

这是客户端线程类:

class Connection extends Thread{
    Socket socket;
    BufferedReader reader;
    PrintWriter writer;

    public Connection(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        System.out.println("来了!");
        try {
           reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           writer = new PrintWriter(socket.getOutputStream());

//           第一次连接,先写出已经存在的联系人
           writer.println("还没有联系人");
//            再读取新建联系人的名字
           String clientName = reader.readLine();
           System.out.println("客户端名字:" +clientName);
           reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
     /*  while (true){
            try {
                if (socket.isConnected() == false){
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
       }*/
    }
}

这是客户端启动时执行的方法:

@Override
    public void windowOpened(WindowEvent e) {
//        窗口打开就建立连接
        try {
            socket = new Socket("localhost",3030);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(socket.getOutputStream());
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null,"服务器未开启,不能连接,请关闭此客户端!");
        }
       /* 连接一旦建立需要立刻执行的事情
        * 1、向服务器发送该客户端的名字
        * 2、获取其他已经存在的客户端名字
        * */
        try {
            System.out.println(reader.readLine());
            writer.println(clientName);
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }

每次一到这个windowOpen方法的System.out.println(reader.readLine());这里就卡死,没有报错,直接卡住。
看了网上说什么readline()会因为没读到数据阻塞,所以猜想是服务端发送数据时一直没有发出来,不过没有找到解决办法,这是卡住时的情况截图
图片说明

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 数学的三元一次方程求解
    • ¥20 iqoo11 如何下载安装工程模式
    • ¥15 本题的答案是不是有问题
    • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
    • ¥15 C++使用Gunplot
    • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
    • ¥15 matlab数字图像处理频率域滤波
    • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
    • ¥15 ELGamal和paillier计算效率谁快?
    • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题