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
- SocketChannel的read值为0
- SocketChannel的read值为0
- Java NIO中SocketChannel read方法的返回值问题
- java nio socketChannel read返回值代表的意思
- SocketChannel read方法一直返回0的原因
- 谨慎使用SocketChannel的read方法
- java nio socketChannel read
- SocketChannel
- SocketChannel
- SocketChannel
- 0X000000该内存不能为read的解决方法
- 0X000000该内存不能为read的解决方法
- 解决" 0X000000该内存不能为read" 的方法
- ox69a8674c指定应用的0x00000000内存不能为"read"
- ServerSocketChannel与SocketChannel的使用
- ServerSocketChannel与SocketChannel的使用
- ServerSocketChannel与SocketChannel的使用
- ServerSocketChannel与SocketChannel的使用
- 推免面试
- ArtifactDescriptorException的解决方法
- OC 中的类方法转换 Swift 语言
- JAVA 线程池
- Android中读取大图片到内存(利用Bitmap缩放)
- SocketChannel的read值为0
- PLM实施IC感悟
- 我是这样提高自己开发效率的(概要篇)
- emacs配置
- LocalM**维护笔记 && Android学习笔记
- 唯品会测试专员实习生面试
- .NET前后台的执行顺序
- Perl DBI 数据库操作
- uva - 11525 Permutation