我有一个 Java 服务器,它在 UDP 套接字端口 100 上侦听请求,并将其响应放在 UDP 套接字端口 200 上。
现在我需要用 PHP 编写一个客户端,它应该把它的请求放在端口 100 上,并且应该在 200 上接收响应。
我的程序能够将请求发送到端口 100 上的服务器,并且服务器也将它的响应放在端口 200 上。但是我的 PHP 程序没有收到响应。它正在进入等待状态。
有趣的是,如果我将响应发送到请求所在的同一端口,我的 PHP 代码就能够接收。但是服务器设计是使用两个端口。一进一出。
这是我的PHP代码
<?php
class SocketHandle {
public function requestService($message) {
// Choose proper domain
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);
$socketHandle = socket_create($domain, SOCK_DGRAM, SOL_UDP);
$serverIP = "127.0.0.1";
$serverSendPort = 100;
$serverRecvPort = 200;
socket_sendto($socketHandle, $message, strlen($message), 0, $serverIP, $serverSendPort);
$response = "";
socket_recvfrom($socketHandle, $response, strlen($message), 0, $serverIP, $serverRecvPort);
return $response;
}
}
?>
我的 Java 服务器代码是
class UDPServer {
public static void main(java.lang.String args[]) throws java.lang.Exception{
try{
java.net.DatagramSocket serverSocket = new java.net.DatagramSocket(100);
java.net.DatagramSocket serverSocket200 = new java.net.DatagramSocket(200);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true){
receiveData = new byte[1024];
java.net.DatagramPacket receivePacket = new java.net.DatagramPacket(receiveData, receiveData.length);
java.lang.System.out.println ("Waiting for datagram packet");
serverSocket.receive(receivePacket);
java.lang.String sentence = new java.lang.String(receivePacket.getData()).trim();
java.net.InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
java.lang.System.out.println ("From: " + IPAddress + ":" + port);
java.lang.System.out.println ("Message: " + sentence);
java.lang.String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
//java.net.DatagramPacket sendPacket = new java.net.DatagramPacket(sendData, sendData.length, IPAddress, port);
java.net.DatagramPacket sendPacket = new java.net.DatagramPacket(sendData, sendData.length, IPAddress, 200);
java.lang.System.out.println("Sending : " + capitalizedSentence);
//serverSocket.send(sendPacket);
serverSocket200.send(sendPacket);
}
}catch (java.net.SocketException ex) {
java.lang.System.out.println("UDP Port 100 / 200 is occupied.");
java.lang.System.exit(1);
}
}
}
这是我的 Java 服务器的输出
>java UDPServer
Waiting for datagram packet
From: /127.0.0.1:54491
Message: Hello
Sending : HELLO
Waiting for datagram packet