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循环没有进去,也没有报错,就一直卡在这句话上了。
十分不解啊纠结好久了,,,望大神不灵赐教。。
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循环没有进去,也没有报错,就一直卡在这句话上了。
十分不解啊纠结好久了,,,望大神不灵赐教。。
用这个很危险,
是带缓冲区的,
有可能多读了数据,放在缓冲区中,
然后,缓冲区中的数据楼主就不管了,
之后,用ObjectInputStream读取IO中的数据去了。
Reader是用来读取字符型数据的,相对于二进制(字节型)数据而言,存在编码问题。
BufferedReader是带缓冲区的,每次读取操作,如果数据不够用,其实会预读一部分数据到缓冲区。
ObjectInputStream是用来读取Java对象的,相对于二进制数据而言,存在序列化问题。我不太明白,楼主在网络上要传输的,到底是什么格式的数据。
如果,你要传输字符型数据,那么,就使用Reader好了。
如果,你要传输Java对象,那么,使用ObjectInputStream好了。
两个都用,这不是让人很诧异的事情么?最后,楼主提出的那个问题:
楼主使用的是BIO的通信方式,是阻塞式的,
如果IO中没有数据读取,那么,程序就会被阻塞到那里,直到有足够的数据。
至于为什么一开始读取就被阻塞,
很大的可能是,客户端没有发送数据。
(楼主看看客户端的代码,客户端应该先发送后接收)
还有就是说要先客户端写服务器才读的问题,这个我看了不是的啦,而且现在是根本到不了之后的while循环的线程处理里面~~~就是直接卡在了ObjectInputStream的建立这里