java网络编程注意事项

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


原文出处:/show_1EFdoOqKivs.html