我在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
来自PHP的错误:警告:socket_recvfrom()的参数数量错误() – 2011-04-14 03:37:06
那么,对于UDP,示例[here](http://www.php.net/manual/en/function.socket-recvfrom.php)似乎做你想做的事情。请注意使用socket_bind()绑定侦听端口。 – Sajid 2011-04-14 03:41:59
工作。谢谢。 – 2011-04-15 14:00:27