2011-04-14 36 views
0

我在Java中的服务器监听UDP套接字端口100上的请求,并把它的UDP套接字端口200UDP Socket编程与PHP

现在我需要在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 

回答

0

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

0

socket_recvfrom端口参数设置远程端口,该答复需要c ome,所以不要在这里传递任何东西。侦听端口在插座被设置时设置,因此它正在侦听端口100.

+0

来自PHP的错误:警告:socket_recvfrom()的参数数量错误() – 2011-04-14 03:37:06

+1

那么,对于UDP,示例[here](http://www.php.net/manual/en/function.socket-recvfrom.php)似乎做你想做的事情。请注意使用socket_bind()绑定侦听端口。 – Sajid 2011-04-14 03:41:59

+0

工作。谢谢。 – 2011-04-15 14:00:27