0

UDPソケットポート100でリクエストをリッスンし、そのレスポンスをUDPソケットポート200に置くJavaのサーバーがあります。

ここで、ポート 100 に要求を送信し、200 で応答を受信するクライアントを PHP で作成する必要があります。

私のプログラムは、ポート 100 でサーバーにリクエストを送信でき、サーバーもポート 200 でレスポンスを送信しています。しかし、私の PHP プログラムはレスポンスを受信して​​いません。待機状態に入ります。

興味深いのは、リクエストが送信されたのと同じポートにレスポンスを送信すると、PHP コードが受信できることです。ただし、サーバーの設計では 2 つのポートを使用します。1 つの着信と 1 つの発信。

ここに私の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 に答える