我正在尝试编写一个可以作为“主服务器”的PHP脚本,并促进两个Java游戏客户端之间的P2P连接。我正在使用允许主服务器端口访问的共享Web主机。
对于初学者,我想测试主服务器和Java客户端之间的UDP套接字连接。这是我的PHP脚本,名为“masterServer.php”
<?php
error_reporting(E_ALL);
set_time_limit(40); // Allow script to execute for at most 40 seconds.
$myFile = "output.txt";
$fh = fopen($myFile, 'w');
if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))
{
if(socket_bind($socket,0, 2005))
{
$clientAddress = 0;
$clientPort = 0;
fwrite($fh, "Start at: ".time());
fwrite($fh, "Waiting for socket at ".time());
if(socket_recvfrom($socket, &$udp_buff, 23, MSG_WAITALL, &$clientAddress, &$clientPort)) // BLOCKING METHOD
{
fwrite($fh, print_r($udp_buff, true));
}
else
{
echo(socket_strerror(socket_last_error()));
die();
}
}
else
{
echo(socket_strerror(socket_last_error()));
die();
}
}
else
{
echo(socket_strerror(socket_last_error()));
die();
}
fwrite($fh, "End at: ".time());
fclose($fh);
?>
我访问masterServer.php以使脚本运行,并在几秒钟内启动一个简单的Java应用程序,该应用程序应该将UDP数据包发送到主服务器。以下是Java应用程序的代码:
package comm;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPSocket
{
public static void main (String[] asdf)
{
try
{
String host = <SERVER ADDRESS>;
int port = 2005;
byte[] message = "Java Source and Support".getBytes();
// Get the internet address of the specified host
InetAddress address = InetAddress.getByName(host);
// Initialize a datagram packet with data and address
DatagramPacket packet = new DatagramPacket(message, message.length,
address, port);
// Create a datagram socket, send the packet through it, close it.
DatagramSocket dsocket = new DatagramSocket();
dsocket.send(packet);
dsocket.close();
}
catch (SocketException e)
{
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
据我了解,PHP服务器没有收到UDP数据包。该脚本不会继续阻塞socket_recvfrom()方法,也不会将UDP数据包的内容写入输出文本文件。任何人都可以帮助我吗?
答案 0 :(得分:-1)
由于共享主机在路由器和防火墙后面运行,因此套接字将侦听其内部IP地址“192.168.1.102”(如上图所示),该地址未连接到互联网,因此它无法接收从外部发送的任何数据内部网络。
<强>解强> 由于您使用的是UDP,因此可以使用称为UDP Puch Holing的常用方法,您可以使用该方法从Internet发送和接收数据。根据您的要求。