1
我想寫一個PHP腳本,可以作爲「主服務器」,並促進兩個Java遊戲客戶端之間的P2P連接。我正在使用允許主服務器訪問端口的共享Web主機。簡單的PHP NAT穿透服務器腳本
對於初學者,我想測試主服務器和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獲取腳本運行,並在幾秒鐘內,我啓動應該發送UDP數據包到主服務器一個簡單的Java應用程序。這裏是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數據包的內容寫入輸出文本文件。誰能幫我嗎?未連接到互聯網
這兩個腳本是在同一臺機器上運行的嗎?你的代碼看起來很好,我順便說一句。 – netcoder 2012-07-13 16:51:08
不,PHP在共享Web服務器(Bluehost)上運行,並且java正在我的開發計算機上運行 – drdeezy 2012-07-13 17:01:34
嘗試在同一臺計算機上運行這兩個服務器並查看它是否有效。這可能是一個防火牆問題。 – netcoder 2012-07-13 17:06:31