public void run() {
        int jie = 0;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(s1.getInputStream()));
            System.out.println(s1.getLocalAddress().toString()+s1.getLocalPort());
            clientIn = new ObjectInputStream(s1.getInputStream()); 
            clientOut = new ObjectOutputStream(s1.getOutputStream());            while (true) {
                System.out.println("server等待接受信息");
                mes = (ServerMessage) clientIn.readObject();
                System.out.println("server接受到了信息" + mes.getType());
                //处理请求模块
                switch (mes.getType()) {
                    case 0://发送大厅信息
                        mes.setDating(GameCenterInfo.getGameCenterInfo().getRooms());
                        break;
                    case 1://创建房间,发送执行结果信息
                        jie = GameCenterInfo.getGameCenterInfo().creatRoom(mes.getNewroom());
                        mes.setType(jie);
                        break;
                    case 2://连接指定房间,发送执行结果信息
                        jie = GameCenterInfo.getGameCenterInfo().conRoom(mes.getConno());
                        mes.setType(jie);
                        if (jie == 0) {
                            mes.setNewroom(GameCenterInfo.getGameCenterInfo().getConRoom());
                        }
                        break;
                    case 3:
                        break;
                    default:
                        System.out.println("无效的信息包");
                }
                clientOut.writeObject(mes);
                System.out.println("server发送了信息" + mes.getType());
            }
        } catch (Exception e) {
        }
    }
这是我写的处理socket连接客户端的部分代码,在构造体中将客户socket传入,然后run方法在一开始的第四行,读取s1的输入流新建bufferedreadr成功,第五行的ip与端口号也打印的出来,但是第六行就无限卡在这里了,之后的for循环没有进去,也没有报错,就一直卡在这句话上了。
十分不解啊纠结好久了,,,望大神不灵赐教。。

解决方案 »

  1.   

    BufferedReader
    用这个很危险,
    是带缓冲区的,
    有可能多读了数据,放在缓冲区中,
    然后,缓冲区中的数据楼主就不管了,
    之后,用ObjectInputStream读取IO中的数据去了。
      

  2.   

    对基本的IO类,掌握的不好。
    Reader是用来读取字符型数据的,相对于二进制(字节型)数据而言,存在编码问题。
    BufferedReader是带缓冲区的,每次读取操作,如果数据不够用,其实会预读一部分数据到缓冲区。
    ObjectInputStream是用来读取Java对象的,相对于二进制数据而言,存在序列化问题。我不太明白,楼主在网络上要传输的,到底是什么格式的数据。
    如果,你要传输字符型数据,那么,就使用Reader好了。
    如果,你要传输Java对象,那么,使用ObjectInputStream好了。
    两个都用,这不是让人很诧异的事情么?最后,楼主提出的那个问题:
    楼主使用的是BIO的通信方式,是阻塞式的,
    如果IO中没有数据读取,那么,程序就会被阻塞到那里,直到有足够的数据。
    至于为什么一开始读取就被阻塞,
    很大的可能是,客户端没有发送数据。
    (楼主看看客户端的代码,客户端应该先发送后接收)
      

  3.   

    我只是想用对象流的,最前面的bufferedreadr只是我想测试一下看看得到的socket是否是无效的而导致了我之后的objectinputstream读不到输入流,这句是可以删掉的,而我所遇到的问题是,如果只是bufferedreadr的话,变异可以通过,打印出他的后一句话,而只是ObjectInputStream时却不会打印他后面的那句话,程序就会卡在这里了。
    还有就是说要先客户端写服务器才读的问题,这个我看了不是的啦,而且现在是根本到不了之后的while循环的线程处理里面~~~就是直接卡在了ObjectInputStream的建立这里