SocketChannel的read值为0

来源:互联网 发布:vue 引入iosselect.js 编辑:程序博客网 时间:2024/05/21 09:41

在看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()方法。


0 0