我正在开发一个需要 ea p2p 服务器的项目,但我还没有找到任何 java-client php-server 示例代码。我了解 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;
}
}
主程序.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,因此在 tcp 会话关闭后,使用 HTTP 打开端口可能会导致端口损坏。 (只是猜测)
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();}
}
}
理论上,上面的代码通过 UDP 发送 HTTP 请求。这样显示的端口就是UDP端口。就我而言,我没有从 PHP 服务器得到任何响应,并停留在 clientSocket.recieve(..) 。我猜是因为我的网络服务器的防火墙阻止了 udp 数据包。
如果代码对任何人都有效,我会像这样继续:
- 将所有访问 ip 和端口保存到数据库并将它们列出给其他客户端。
- 像上面那样将您的数据写入数据报包中到另一个客户端。
我希望这会有所帮助。如果有人可以让它完全工作,我也会对此感兴趣:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)