用PHP进行UDP套接字编程

时间:2011-04-14 03:28:23

标签: php udpclient

我有一个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 :(得分:0)

socket_recvfrom端口参数设置回复需要来自的远程端口,因此请勿在此处传递任何内容。在制作套接字时设置侦听端口,因此它正在侦听端口100。

答案 1 :(得分:0)

在Linux中,它不会侦听1024以下的端口。如果使用1024以上的端口,它将起作用。