0

我有一个 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
4

2 回答 2

0

socket_recvfromport 参数设置回复需要来自的远程端口,所以这里不要传递任何东西。监听端口是在创建套接字时设置的,因此它正在监听端口 100。

于 2011-04-14T03:32:50.130 回答
0

在 Linux 中,它不会监听低于 1024 的端口。如果你使用高于 1024 的端口,它会工作。

于 2012-01-28T10:29:31.630 回答