业务流程:
我有一个语词列表,想查看在百度百科中是否有对应的词条。需要访问含有中文的指定URL。(题外说一句,由于URL中含有中文,直接访问会乱码,所以需要对中文部分进行编码解决。)由于百科对词条有大量的重定向(301、302等),所以也要对这部分处理。(这部分不是本文重点,所以忽略)。我使用BufferedReader包裹得到的输入流,但是由于readline()方法是阻塞方法。由于网络原因,可能会导致readline()无法得到终止符从而出现阻塞。
URL url = new URL("https://baike.baidu.com/search/word?word=Lamy");
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.connect();
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder sb = new StringBuilder();
String str = "";
while ((str = bufferedReader.readLine()) != null) {//readline()是阻塞方法,如果接受不到换行符等会抑制阻塞,导致程序停留在while所在行
sb.append(str);
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
httpUrlConn.disconnect();
String res = sb.toString();
网上之前很多人说将while循环去掉,只读取一次,或者服务器关闭套接字通知客户端的BufferedReader。但是,针对我目前的需求,是不合适的。
首先,无法确定从百度百科获取数据的长度,所以,无法只运行一次readline()完成功能。(网上的经验大多数是针对自己的服务器,客户端与服务器之间就数据长度已事先沟通好。)
其次,对于关闭套接字,由于网络不稳定,我无法确定是链接已断开还是传输速度过慢。
第三,针对网上设置超时选项的解决办法如:
httpUrlConn.setConnectTimeout(300);//设置连接超时
httpUrlConn.setReadTimeout(100);//设置建立连接后,到得到数据前的等待超时时间
对于我来说是无用的,因为出现的阻塞是在已经获取到一部分数据后,所以ReadTimeout无效。
void java.net.URLConnection.setReadTimeout(int timeout)
Sets the read timeout to a specified timeout, in milliseconds. A non-zero value specifies the timeout when reading from Input stream when a connection is established to a resource. If the timeout expires before there is data available for read, a java.net.SocketTimeoutException is raised. A timeout of zero is interpreted as an infinite timeout.
Some non-standard implementation of this method ignores the specified timeout. To see the read timeout set, please call getReadTimeout().
Parameters:timeout an int that specifies the timeout value to be used in millisecondsThrows:IllegalArgumentException -
import java.io.
BufferedReader
;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.
HttpURLConnection
;
import java.net.URL;
public class ToInter...
基于Java的BIO API,实现简单的客户端和服务端通信模型,客户端
使用
BufferedReader
的readLine方法读取System.in上的用户输入,然后通过字节输出流发送给服务端,服务端
使用
BufferedReader
的readLine方法读取客户端的数据,进行打印;可以看到,for循环中有个条件,当读取到的字节中包含'\n' 或者 '\r'的时候,会设置eol = true,后面会根据该eol标志,return读取到的字符串,结束readLine方法;
其实
问题
很简单,就是很正常的
HttpURLConnection
POST连接,当getResponseCode为
HttpURLConnection
.HTTP_OK(200)和
HttpURLConnection
.HTTP_CREATED(201)时没有任何
问题
。
FileUtil fileUtils = new FileUtil();
URL url = new URL(urlStr);
urlConn = (
HttpURLConnection
) url.openConnection();
urlConn.setRequestProperty("Accept-Encoding", "identity");
urlConn.con
在项目中遇到了一个
HttpURLConnection
网络请求报异常的
问题
java.io.FileNotFoundException,后来通过debug定位到具体得
问题
出现
在 urlConnection.
getInputStream
()上。
HttpURLConnection
POST请求时,当getResponseCode为
HttpURLConnection
.HTTP_OK(200)和
HttpURLConnection
.HTTP_CREATED(201)时正常连接,其他值时比如(403),httpURL
1、该方法的作用是每次都读一行,可以省略很多手动拼接buffer的步骤;
2、它比较高效,相对于一个字符/字节地读取、转换、返回来说,它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议
使用
它们把其它Reader/InputStream包起来,使得读取数据更高效。
3、对于文本读取来说,逐行读取,非常相符。
但是,该方法是
阻塞
方法,如果不指定buffer大小则readLine(),
使用
的buffer有8192个字符。在达到buff
我有一个套接字客户端向套接字服务器发送文本,但ReadLine似乎没有等待接收行的内容,然后再继续。这是接收文本的服务器的:public void run() {try {serveurSocket = new ServerSocket(PORT_ID);connexionSocket = serveurSocket.accept();
BufferedReader
reader = new Buf...
在Android开发中网络请求是最常用的操作之一, Android SDK中对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口:
1、标准Java接口(java.NET) —-
HttpURLConnection
,可以实现简单的基于URL请求、响应功能;
2、Apache接口(org.appache.http)—-HttpClient,
使用
起来更方面更强大。
但在android API...
通过socket测试工具在电脑上发送消息,Android真机可以收到响应
BufferedReader
.ready()返回true,但是readline却一直
阻塞
。
原因:readline()只有在遇到换行符的时候才会结束,因为发消息的时候加一个换行符即可。
测试工具下载地址:http://files.cnblogs.com/files/feijian/SocketTool.rar
附上我的so...