Программирование UDP-сокетов с помощью PHP - PullRequest
0 голосов
/ 14 апреля 2011

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

Ответы [ 2 ]

0 голосов
/ 28 января 2012

В Linux он не прослушивает порты ниже 1024. Если вы используете порт выше 1024, он будет работать.

0 голосов
/ 14 апреля 2011

Параметр порта socket_recvfrom устанавливает порт remote , с которого должен поступить ответ, поэтому ничего не передавайте здесь.Порт прослушивания устанавливается при создании сокета, и поэтому он прослушивает порт 100.

...