Это упрощенное соединение сервер-клиент в Java, которое, похоже, не работает. Я сделал сервер, который правильно работает в браузере. Я также сделал http-соединение, которое получает данные с интернет-сайта. Тем не менее, заставить обоих поговорить друг с другом, кажется, сложно.Невозможно установить соединение между HttpURLConnection и HttpServer
У меня есть три класса. Common содержит строки и данные для классов Server и Client для использования.
Common.java:
import java.io.Serializable;
public class Common {
public static class Data implements Serializable{
private static final long serialVersionUID = 1L;
public String value = null;
public Data(String value) {
this.value = value;
}
}
public static final String PROTOCOL = "http";
public static final String HOST = "localhost";
public static final Integer PORT = 39640;
public static final String PAGE = "/test";
public static final String POST = "POST";
}
Server.java:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.*;
@SuppressWarnings("restriction")
public class Server {
public static class Handler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
exchange.getResponseHeaders().add("accept", "*/*");
try {
ObjectInputStream in = new ObjectInputStream(exchange.getRequestBody());
Common.Data data = (Common.Data) in.readObject();
System.out.println(data.value);
exchange.sendResponseHeaders(200, 0);
exchange.close();
} catch(Exception e) {
exchange.sendResponseHeaders(404, 0);
exchange.close();
}
}
}
public static void main(String[] args) {
InetSocketAddress socketAddress = null;
HttpServer server = null;
try {
InetAddress address = InetAddress.getByName(Common.HOST);
socketAddress = new InetSocketAddress(address, Common.PORT);
server = HttpServer.create(socketAddress, 10);
//Add contexts
server.createContext(Common.PAGE, new Handler());
server.start();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Client.java
import java.io.ObjectOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Client {
public static void main(String[] args) {
try {
URL url = new URL(Common.PROTOCOL, Common.HOST, Common.PORT, Common.PAGE);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(Common.POST);
connection.setDoOutput(true);
connection.connect();
ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
out.writeObject(new Common.Data("Hello world"));
} catch(Exception e) {
e.printStackTrace();
}
}
}
EDIT Я использовал сс -nt, чтобы определить, что соединение в какой-то мере происходит, хотя данные не bei перенесено.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.0.2.15:46759 108.168.151.6:80
ESTAB 0 0 10.0.2.15:59918 198.252.206.149:443
ESTAB 0 0 127.0.0.1:39030 127.0.0.1:52906
ESTAB 0 0 ::ffff:127.0.0.1:39640 ::ffff:127.0.0.1:35764 ESTAB 0 0 ::ffff:127.0.0.1:35764 ::ffff:127.0.0.1:39640
ESTAB 0 0 ::ffff:127.0.0.1:52906 ::ffff:127.0.0.1:39030
Следует отметить, что в этом примере кода в обработчике не было exchange.close(). Я добавил это, но мой код проекта имеет метод close(), поэтому он не был частью моей исходной проблемы. – AaronF