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

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条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥30 这是哪个作者做的宝宝起名网站
    • ¥60 版本过低apk如何修改可以兼容新的安卓系统
    • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题
    • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
    • ¥15 YoloV5 第三方库的版本对照问题
    • ¥15 请完成下列相关问题!