java - 错误请求和超时

标签 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);
          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;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;

public class GetWebPageUsingSockets {

    public static void main(String[] args) {
        String urlString;

        urlString = "www.google.com";

        accessWeb(urlString);
    }

    private static void accessWeb(String urlString) {
        String host;
        String page;
        int slashLoc;

        // Set up encoding and decoding
        Charset charset = Charset.forName("ISO-8859-1");
        CharsetDecoder decoder = charset.newDecoder();
        CharsetEncoder encoder = charset.newEncoder();

        if ((slashLoc = urlString.indexOf('/')) < 0) {
            host = urlString;
            page = "";
        } else {
            host = urlString.substring(0, slashLoc);
            page = urlString.substring(slashLoc);
        }

        System.out.println("Accessing web page demonstration");
        System.out.println("Host: '" + host + "' Page: '" + page + "'");

        SocketChannel channel = null;

        try {
            ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
            CharBuffer charBuffer = CharBuffer.allocate(1024);

            InetSocketAddress socketAddress = new InetSocketAddress(host, 80);
            channel = SocketChannel.open();
            channel.connect(socketAddress);

            String request = "GET " + page + " \r\n\r\n";
            channel.write(encoder.encode(CharBuffer.wrap(request)));

            while ((channel.read(buffer)) != -1) {
                buffer.flip();
                decoder.decode(buffer, charBuffer, false);
                charBuffer.flip();
                System.out.println(charBuffer);
                buffer.clear();
                charBuffer.clear();
            }
        } catch (UnknownHostException e) {
            System.err.println(e);
        } catch (IOException e) {
            System.err.println(e);
        } finally {
            if (channel != null) {
                try {
                    channel.close();
                } catch (IOException ignored) {
                }
            }
        }

        System.out.println("\nDone.");
    }
}

关于java - 错误请求和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24326373/

相关文章:

java - 使用 OpenId 进行 Alfresco 身份验证

javascript - Socket.io 按钮监听器无法在移动设备上工作

android - 如果我想在 pc 和 Android 模拟器之间建立套接字连接,正确的 IP 地址是多少?

c - 在反向 shell 中打印当前目录

java - 无法连接到 ssl 服务器收到致命警报 : certificate_unknown and ReadDataRecord(SSLSocketImpl

java - jframe 中的容器配置

JAVA:进程停止时如何调用方法(甚至可能吗?)

java - Spring Security 匿名用户可以访问每个 url

java - 在列表中 n 个大小的 bin 内随机播放列表

c++ - poll() 系统调用以及之后接收或发送数据的行为