我正在尝试编写单独的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();
}
}
}
由于
答案 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");
}
}
小测试:
当我运行代码并在此之后打开浏览器并在浏览器中编写,例如: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;
}
}