1. 将接收数据放入到线程中,无限循环接收数据,如:
Thread t = new Thread(new Runnable() {
public void run() {
while (true) {
byte[] buff = new byte[1024 * 8];
try {
int readLen = inputStream.read(buff);
if(readLen==-1){
System.out.println("客户端已经关闭链接,服务器将关闭!");
break;
}
log(Arrays.toString(buff));
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
});
t.start();
2. 如果一方关闭socket,那么另一方的输入流的read()方法不会再阻塞,而是立刻执行结束,所以写法要注意,否则会导致无限接收到信息
错误的写法:
//这种写法会导致无限接收到信息,而且i的值为0(没记错的话,囧) int i=inputStream.read();
正确的写法:
//声明一个数组,然后往这个数组里面读,此时返回的i为-1,判断为-1时退出循环
byte[] buff = new byte[1024 * 8];
int i = inputStream.read(buff);
if(i==-1){
System.out.println("客户端已经关闭链接,服务器将关闭!");
break;
}3. 接收网络数据时,由于种种原因,一次读取数据,没有读取到完整的数据,解决方法就是循环接收,一直接收到指定容量的数据为止
(此bug困扰我好几天,虽然是tcp协议,但由于种种原因,还是会导致一些问题,囧)
此处的bis是缓冲流BufferedInputStream,默认缓冲大小是8k
解决代码如下:
private int read1(byte[] buff) throws IOException {
int len=buff.length;
int readLenCount=0;
int readLen=bis.read(buff,0,buff.length);
if(readLen==-1){
return readLen;
}
readLenCount=readLen;
/*
如果读取的长度与传入的buff长度不同,那么继续读取
*/
while(readLenCount!=len){
readLen=bis.read(buff,readLen,len-readLenCount);
if(readLen==-1){
return readLenCount;
}
readLenCount=readLenCount+readLen;
}
return readLenCount;
}4.一次发送数据的字节数不要太大,最好不要超过1024个byte