SocketChannel的read值为0

本文通过一个具体的SocketChannel示例,分析了未正确发送HTTP请求导致无法从服务器读取内容的问题,并对比了使用Socket及URL方式的成功实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值