在看ifeve上的SocketChannel教程时,写了一个例子,但是从ByteBuffer中read的数值一直是0,这让我烦躁不宜。
然后用URL进行测试都是可以获取内容的,但是用Socket获取的stream也读不到内容,我在网上找了一下,发现自己犯了一个低级的错误。
错误的原因是:
我没有发送请求,就希望服务器能够给我一个响应,这是不可能的。
SocketChannel代码
SocketChannel sc = SocketChannel.open();
sc.configureBlocking(false);
sc.connect(new InetSocketAddress("jenkov.com", 80));
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.clear();
while(!sc.finishConnect()){
}
String s = "GET / HTTP/1.1\r\n\r\n";
buf.put(s.getBytes());
buf.flip();
while(buf.hasRemaining()){
sc.write(buf);
}
buf.clear();
int b = sc.read(buf);
while(b != -1){
buf.flip();
if(b == 0){
try{
Thread.sleep(1);
}catch(InterruptedException e){
e.printStackTrace();
}
buf.clear();
continue;
}
while(buf.hasRemaining()){
System.out.print((char)buf.get());
}
buf.clear();
b = sc.read(buf);
}
sc.close();
Socket代码
Socket socket = new Socket("jenkov.com", 80);
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
osw.write("GET / HTTP/1.0\r\nHOST:jenkov.com\r\nAccept:*/*\r\n\r\n");
osw.flush();
char[] cbuf = new char[1024];
while(!isr.ready()){
}
int count = isr.read(cbuf);
while(count != -1){
for(int i = 0; i < count; i++){
System.out.print(cbuf[i]);
}
cbuf = new char[1024];
count = isr.read(cbuf);
}
socket.close();
URL代码
URL url = new URL("http://jenkov.com");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
或
URL url = new URL("http://jenkov.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setFollowRedirects(true);
con.setInstanceFollowRedirects(true);
con.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
注意,在HttpURLConnection.getInputStream中,隐含了向服务器发送请求的writeRequests()方法。