使用ServerSocket和Socket类从浏览器获取完整的URL路径

时间:2016-10-06 03:18:57

标签: java sockets networking

我正在尝试编写单独的HTTP Server,我需要帮助 ServerSocket或Socket类可以在URL上调用并将其添加到代码中的方法是什么。

例如,如果我在浏览器中编写以下链接<b>http://localhost:8080/coupon/add?name=coupon name</b>,我希望将此链接添加到我的代码中。

也许谁知道我该怎么做?

我的简单代码:

import java.io.IOException;

import java.net.ServerSocket;
import java.net.Socket;


public class HTTPServer {

    public static void main(String[] args) {

        new HTTPServer().startServer();
    }

    public void startServer() {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {

            System.out.println("Server is started");
            while (true) {
                Socket socket = serverSocket.accept();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

由于

3 个答案:

答案 0 :(得分:2)

现在所有代码都设置了TCP服务器。

HTTP是Layer 7协议。

一旦接受来自客户端的连接,HTTP就可以用于通过该TCP套接字进行通信。

您必须解析客户端发送的HTTP请求,并且您必须知道该URL。

在你的情况下,你说:

  

我在浏览器中编写了以下链接http://localhost:8080/coupon/add?name=coupon name

您的浏览器将发送HTTP请求,如下例所示:

GET /coupon/add?name=coupon+name HTTP/1.0
Host: localhost:8080

实际上,那里会有更多的HTTP标头,以及一个尾随\r\n,但为了我们的利益,让我们保持简单。

请注意,空格等特殊字符为URL-encoded,但空格也会在查询字符串中编码为+ - 可能是+%20,具体取决于客户端。

希望您从这个解释中合理地了解如何从此HTTP请求获取URL。

实际完整链接中唯一缺少的部分是http://部分。 HTTP和HTTPS之间的区别不是HTTP协议的一部分 - 它在套接字层之上但在HTTP协议层之下。如果你有SSL套接字,你就知道它在服务器端,并根据它是SSL套接字还是&#34; plain&#34;来确定。套接字,无论是http还是https

希望有所帮助。

答案 1 :(得分:0)

我改进了测试startServer获取信息的方法。 我试图将来自任何浏览器的URL的数据包含到JAVA的URI或URL类中。 这不可能?也许谁知道我该怎么做?

public void startServer() {
    try (ServerSocket serverSocket = new ServerSocket(8080)) {

        System.out.println("Server is started");
        while (true) {

            Socket socket = serverSocket.accept();

            System.out.println("SERVER SOCKET TESTS:");
            System.out.println("getChannel: " + serverSocket.getChannel());
            System.out.println("getInetAddress: " + serverSocket.getInetAddress());
            System.out.println("getLocalPort: " + serverSocket.getLocalPort());
            System.out.println("getLocalSocketAddress: " + serverSocket.getLocalSocketAddress());

            System.out.println();

            System.out.println("CLIENT SOCKET TESTS:");
            System.out.println("getChannel: " + socket.getChannel());
            System.out.println("getLocalAddress: " + socket.getLocalAddress());
            System.out.println("getLocalPort: " + socket.getLocalPort());
            System.out.println("getLocalSocketAddress: " + socket.getLocalSocketAddress());
            System.out.println("getRemoteSocketAddress: " + socket.getRemoteSocketAddress());
            System.out.println("getInetAddress: " + socket.getInetAddress());
            System.out.println("getInputStream: " + socket.getInputStream());
            System.out.println("getOutputStream: " + socket.getOutputStream());

            System.out.println();

            System.out.println("URI - GET INFORMATION:");
            URI uri = new URI("httpscheme://world.hello.com/thismy?parameter=value");
            System.out.println(uri.getHost());
            System.out.println(uri.getPath());
            System.out.println(uri.getQuery());
            System.out.println(uri.getScheme());
        }

    } catch (Exception e) {
        System.out.println("error");
    }
}

小测试:

enter image description here

当我运行代码并在此之后打开浏览器并在浏览器中编写,例如:http://localhost:8080我获取了信息,但我不理解以下内容: 为什么serverSocket方法中的getInetAddress对象(serverSocket.getInetAddress)具有IP4且为0.0.0.0(为什么不是在我的计算机上定义的标准本地IP)和socket getInetAddress方法(socket.getInetAddress)的对象具有IP6,并且0:0:0:0:0:0:0:1。如何获取标准主机名localhost如何获取URI类(包含链接数据块)?

该端口很好:8080。

答案 2 :(得分:0)

获取URL路径的问题已解决。

    package pk6HttpServer;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by Morris on 08/10/16.
 */
public class HTTPServer {

    private static String headerData;

    public static void main(String[] args) {

        new HTTPServer().startServer();
    }

    public void startServer() {

        try (ServerSocket serverSocket = new ServerSocket(8080)) {

            boolean isClosed = false;

            System.out.println("Server is started");

            while (true) {
                Socket socket = serverSocket.accept();

                try {
                    try (InputStream raw = socket.getInputStream()) { // ARM

                        System.out.println("=================BEFORE STARTING READING HEADER =======================");

                        System.out.println("Collecting data to string array...");

                        headerData = getHeaderToArray(raw);
//
                        System.out.println("+++++++++++++++++ AFTER ENDING READING HEADER +++++++++++++++++++++++");
                        System.out.println("Hello World");
                    }
                } catch (MalformedURLException ex) {
                    System.err.println(socket.getLocalAddress() + " is not a parseable URL");

                } catch (IOException ex) {
                    System.err.println(ex.getMessage());
                }
            }

        } catch (Exception ex) {
            System.out.println("error# " + ex.getMessage());
        }
    }

    public static String getHeaderToArray(InputStream inputStream) {

        String headerTempData = "";

        // chain the InputStream to a Reader
        Reader reader = new InputStreamReader(inputStream);
        try {
            int c;
            while ((c = reader.read()) != -1) {
                System.out.print((char) c);
                headerTempData += (char) c;

                if (headerTempData.contains("\r\n\r\n"))
                    break;
            }
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
        headerData = headerTempData;

        return headerTempData;
    }
}