Java 错误的请求和超时
我想使用套接字访问任意网页(作为我自己的学习机制)。下面的代码不起作用,我做错了什么Java 错误的请求和超时,java,sockets,Java,Sockets,我想使用套接字访问任意网页(作为我自己的学习机制)。下面的代码不起作用,我做错了什么 import java.net.*; import java.io.*; public class Example { public static void main(String args[]) throws Exception { Socket socket = new Socket("www.google.com", 80);
import java.net.*;
import java.io.*;
public class Example
{
public static void main(String args[]) throws Exception
{
Socket socket =
new Socket("www.google.com", 80);
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader =
new BufferedReader(
new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println("GET / HTTP/1.1 \\r\\n Host: www.google.com \\r\\n\\r\\n");
System.out.println("echo: " + reader.readLine());
}
}
}
在尝试了几个小时后,我无法找出我到底做错了什么。我想要的只是谷歌或其他一些网站的主页。有人能帮我吗?您可以尝试以下方法(使用套接字)
package com.example.webpagesocket;
导入java.io.IOException;
导入java.net.InetSocketAddress;
导入java.net.UnknownHostException;
导入java.nio.ByteBuffer;
导入java.nio.CharBuffer;
导入java.nio.channels.SocketChannel;
导入java.nio.charset.charset;
导入java.nio.charset.CharsetDecoder;
导入java.nio.charset.CharsetEncoder;
公共类GetWebPageUsingSockets{
公共静态void main(字符串[]args){
字符串URL字符串;
urlString=“www.google.com”;
accessWeb(urlString);
}
私有静态void accessWeb(字符串urlString){
字符串主机;
字符串页;
int slashLoc;
//设置编码和解码
Charset Charset=Charset.forName(“ISO-8859-1”);
CharsetDecoder=charset.newDecoder();
CharsetEncoder=charset.newEncoder();
如果((slashLoc=urlString.indexOf('/'))<0){
host=urlString;
第“”页;
}否则{
host=urlString.substring(0,slashLoc);
page=urlString.substring(slashLoc);
}
System.out.println(“访问网页演示”);
System.out.println(“主机:”+Host+“'Page:“+Page+””);
SocketChannel通道=空;
试一试{
ByteBuffer缓冲区=ByteBuffer.allocateDirect(1024);
CharBuffer CharBuffer=CharBuffer.allocate(1024);
InetSocketAddress-socketAddress=新的InetSocketAddress(主机,80);
通道=SocketChannel.open();
channel.connect(socketAddress);
String request=“GET”+page+“\r\n\r\n”;
channel.write(编码器.encode(CharBuffer.wrap(请求));
而((通道读取(缓冲区))!=-1){
flip();
解码(缓冲区,字符缓冲区,假);
charBuffer.flip();
System.out.println(charBuffer);
buffer.clear();
charBuffer.clear();
}
}捕获(未知后异常e){
系统错误println(e);
}捕获(IOE异常){
系统错误println(e);
}最后{
如果(通道!=null){
试一试{
channel.close();
}捕获(忽略IOException){
}
}
}
System.out.println(“\n完成”);
}
}
编辑:第一次阅读时没有注意到\
看起来您正在连续向主机发送“GET/HTTP/1.1\\r\\n主机:www.google.com\\r\\n\\r\\n”
(每次读取时)。您最好将其排除在循环之外,并发送true回车+换行
和不可打印字符\r\n
:
out.println("GET / HTTP/1.1 \r\nHost: www.google.com\r\n\r\n");
String userInput;
while ((userInput = stdIn.readLine()) != null) {
您只有在发送
GET
后才开始阅读,但是套接字将缓冲数据。尝试使用apache http客户端。目的是学习标准的、普通的Java。不过,谢谢你的建议。代码看起来不错!你到底得到了什么错误?400s和408s以及I/O阻塞到我必须结束进程的程度这与其说是结果,不如说是实现结果的方法。我正在尝试使用sockets…Redid示例使用sockets(并编辑问题以澄清需要什么)哇,它成功了。非常感谢您的编辑。我希望我能给你们两个打勾,但我已经给了他,他做了很多工作来帮助我,当我认为这是gg。非常感谢,伙计。不,真的。你不知道我做这个有多久了。
out.println("GET / HTTP/1.1 \r\nHost: www.google.com\r\n\r\n");
String userInput;
while ((userInput = stdIn.readLine()) != null) {