Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误的请求和超时_Java_Sockets - Fatal编程技术网

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) {