1

「マスターサーバー」として機能し、2 つの Java ゲームクライアント間の P2P 接続を容易にする PHP スクリプトを作成しようとしています。マスター サーバーのポート アクセスを許可する共有 Web ホストを使用しています。

手始めに、マスター サーバーと Java クライアント間の UDP ソケット接続をテストしたいと思いました。「masterServer.php」という名前の 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 パケットの内容を出力テキスト ファイルに書き込みません。誰でも私を助けることができますか?

4

1 に答える 1

-1

ここに画像の説明を入力

共有ホスティングはルーターとファイアウォールの背後で実行されるため、ソケットはインターネットに接続されていない内部 IP アドレス「192.168.1.102」(上の図で言及) をリッスンするため、内部ネットワークの外部から送信されたデータを受信できません。 .

ソリューション UDP を使用しているため、UDP Puch Holingとして知られる一般的な方法を使用して、インターネットからデータを送受信できます。あなたの条件に従って。

于 2013-05-17T20:37:32.240 に答える