2012-07-13 57 views
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數據包的內容寫入輸出文本文件。誰能幫我嗎?未連接到互聯網

+0

這兩個腳本是在同一臺機器上運行的嗎?你的代碼看起來很好,我順便說一句。 – netcoder 2012-07-13 16:51:08

+0

不,PHP在共享Web服務器(Bluehost)上運行,並且java正在我的開發計算機上運行 – drdeezy 2012-07-13 17:01:34

+0

嘗試在同一臺計算機上運行這兩個服務器並查看它是否有效。這可能是一個防火牆問題。 – netcoder 2012-07-13 17:06:31

回答

0

enter image description here

因爲共享主機的路由器之後的運行和防火牆的插座會聽其內部的IP地址「192.168.1.102」(如上圖提),所以它不能收回從內部網絡外部發送的任何數據。

SOLUTION 由於您使用UDP,您可以使用被稱爲UDP Puch Holing一種常用的方法,使用它可以從互聯網上發送和接收數據。根據您的要求。