目录
Hello!大家好哇,我是灰小猿,一个超会写bug的程序猿,
最近一直在做项目的开发,所以很少有时间来打理博客,今天抽出一点时间来对我在开发中遇到的一些小问题和大家分享一下,
在做使用TCP/IP协议进行网络通信时,遇到这样一个问题,就是在同一个局域网中,我作为客户端,以另一台电脑作为服务器进行通信时发现,两者之间可以建立C/S连接,但是对于服务器发送过来的数据,我这边以read()方法来读取字符的输入流的长度时却显示读取失败,报错类型为;
java.net.SocketTimeoutException: Read timed out
即读取时间超时,但是从服务器发送过来的数据并不很长,所以按照正常情况下读取超时的情况一般是不会出现的,经过仔细研究发现是因为read()方法读取的是单个字符,会以流末尾作为结束,也就是说只要连接方一直在重复的发送数据,那么read()就会一直在读取一个很长的输入流,这样的话当然就会很容易造成读取超时的问题了,而我做的测试也正是让服务器端一直在向客户端发送相同的数据。显然以read()方法来读取这样的操作是显然不可以的。
原因找到了,接下来就是如何解决了,在网上找了资料后发现,对输入流数据的读取除了read()方法以外,还有readline()方法,但是两者存在使用上的明显差异,
read()方法读取输入流
read()方法读取的是单个字符,也可以说只要有输入流就会一直读取,返回的值是:作为一个整数(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1
因此使用该方法时应该尽量避免输入流数据重复的发送,这样会导致read()读取到很长的重复数据,导致读取超时,但是对于仅有单次发送的输入流,则可以使用read()方法,具体使用如下:
InputStream is = client.getInputStream(); //获取到客户端的输入流 byte[] b = new byte[1024]; //定义字节数组 int len = is.read(b); //由于信息的传输是以二进制的形式,所以要以二进制的形式进行数据的读取 String data = new String(b, 0,len); System.out.println("输入流消息:" + data);
Readline()方法读取输入流
readLine方法读取一个是文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 返回的值是:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
也就是说只要readLine方法读取到的输入流中含有回车换行符,则读取结束,这样的话对于连续重复发送的输入流信息,我们可以在每条信息的末尾增加一个回车换行符,这样readLine方法读取到该符号时就会自动结束,
具体使用如下:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312")); String msg = br.readLine(); if(msg != null) { System.out.println("收到输入流信息:" + msg + "\n"); }
好了,关于网络通信对输入流信息读取的两种方法的介绍就先和大家分享到这里了,其中有不足的地方还希望各位大佬指正,
觉得不错记得点赞关注哟!
大灰狼陪你一起进步!
编辑