Я работаю над проектом, который требует ea p2p-сервера, но я не нашел никакого примера кода php-сервера java-client. Я понимаю концепцию, как работает дырокол udp, но я не могу заставить что-либо работать в коде.
Что я пробовал:
TheSocket.java
public class TheSocket {
public static String response = "hello";
public static String request;
public static String webServerAddress;
public static ServerSocket s;
protected static ServerSocket getServerSocket(int port)throws Exception{
return new ServerSocket(port);
}
public static void handleRequest(Socket s){
BufferedReader is;
PrintWriter os;
try{
webServerAddress = s.getInetAddress().toString();
is = new BufferedReader(new InputStreamReader(s.getInputStream()));
request = is.readLine();
System.out.println(request);
os = new PrintWriter(s.getOutputStream(), true);
os.println("HTTP/1.0 200");
os.println("Content-type: text/html");
os.println("Server-name: TheSocket");
os.println("Content-length: " + response.length());
os.println("");
os.println(response);
os.flush();
os.close();
s.close();
}catch(Exception e){
System.out.println("Failed to send response to client: " + e.getMessage());
}finally{
if(s != null){
try{
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
return;
}
}
Main.java
public class Main {
public static void main(String[] args)throws Exception{
TheSocket.s = TheSocket.getServerSocket(6789);
while(true){
Socket serverSocket = TheSocket.s.accept();
TheSocket.handleRequest(serverSocket);
}
}
PHP-CONNECT.php — чтобы получить порт других пользователей, я вручную подключаюсь и использую порт, показанный на веб-странице.
<?php
echo $_SERVER['REMOTE_ADDR'].':'.$_SERVER['REMOTE_PORT'];
?>
Проблема с кодом выше в том, что он не может сделать это в сокет, если я не перенесу вперед.
Прокомментируйте, если у вас есть какие-либо вопросы!
Я столкнулся с аналогичной проблемой. И пытался решить это аналогичным образом.
Некоторые части вашего кода выглядят неправильно для меня.
Сокеты в Java сделаны для TCP но название говорит UDP. Поэтому вы должны использовать DatagramSockets.
Но потом мы дошли до того, что я тоже застрял. HTTP-запросы также используют tcp, поэтому открытие порта с помощью HTTP может привести к повреждению порта после закрытия сеанса tcp. (Просто предположение)
public class Main {
public static void main(String[] args) {
try
{
String httpRequest = "GET /index.php HTTP/1.1\n" +
"Host: <PHP SERVER NAME HERE>";
InetAddress IPAddress = InetAddress.getByName(<PHP SERVER IP HERE>);
DatagramSocket clientSocket = new DatagramSocket();
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = httpRequest;
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 80);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}catch(Exception e){e.printStackTrace();}
}}
Код выше теоретически отправляет запрос HTTP через UDP. Так что отображаемый порт будет UDP-портом. В моем случае я не получил никакого ответа от сервера PHP и застрял в clientSocket.recieve (..). Я думаю, потому что брандмауэр моего веб-сервера блокирует пакеты udp.
Если код работает кем-то, я бы поступил так:
Я надеюсь, что это может помочь. Если кто-то может заставить это работать полностью, я был бы также заинтересован в этом 🙂
Других решений пока нет …