У меня есть сервер на 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