Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单的PHP NAT穿透服务器脚本_Java_Php_P2p_Nat_Hole Punching - Fatal编程技术网

Java 简单的PHP NAT穿透服务器脚本

Java 简单的PHP NAT穿透服务器脚本,java,php,p2p,nat,hole-punching,Java,Php,P2p,Nat,Hole Punching,我正在尝试编写一个PHP脚本,它可以用作“主服务器”,并促进两个Java游戏客户端之间的P2P连接。我使用的是一个共享web主机,它允许主服务器访问端口 首先,我想测试主服务器和java客户机之间的UDP套接字连接。这是我的PHP脚本,名为“masterServer.PHP” 我访问masterServer.php以运行脚本,在几秒钟内,我启动了一个简单的Java应用程序,它应该向主服务器发送UDP数据包。以下是Java应用程序的代码: package comm; import java.

我正在尝试编写一个PHP脚本,它可以用作“主服务器”,并促进两个Java游戏客户端之间的P2P连接。我使用的是一个共享web主机,它允许主服务器访问端口

首先,我想测试主服务器和java客户机之间的UDP套接字连接。这是我的PHP脚本,名为“masterServer.PHP”


我访问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();
    }

}
}
包通信;
导入java.io.IOException;
导入java.net.DatagramPacket;
导入java.net.DatagramSocket;
导入java.net.InetAddress;
导入java.net.SocketException;
公共类UDPSocket
{
公共静态void main(字符串[]asdf)
{
尝试
{
字符串主机=;
国际港口=2005年;
byte[]message=“Java源代码和支持”.getBytes();
//获取指定主机的internet地址
InetAddress=InetAddress.getByName(主机);
//使用数据和地址初始化数据报数据包
DatagramPacket数据包=新的DatagramPacket(message,message.length,
地址、港口);
//创建一个数据报套接字,通过它发送数据包,然后关闭它。
DatagramSocket dsocket=新的DatagramSocket();
数据包发送(数据包);
dsocket.close();
} 
捕获(SocketException e)
{
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
据我了解,PHP服务器没有接收UDP数据包。脚本不会继续通过阻塞套接字_recvfrom()方法,也不会将UDP数据包的内容写入输出文本文件。有人能帮我吗?

由于共享主机在路由器和防火墙后面运行,所以您的套接字将侦听其内部ip地址“192.168.1.102”(如上图所述),该地址未连接到internet,因此无法接收从内部网络外部发送的任何数据

解决方案
因为您使用的是UDP,所以您可以使用一种流行的方法,称为UDP,通过该方法可以从internet发送和接收数据。根据您的要求

这两个脚本是否在同一台机器上运行?顺便说一句,你的代码在我看来很好。不,PHP在共享web服务器(Bluehost)上运行,java在我的开发机器上运行,这两个机器都在同一台机器上运行,看看它是否工作。这可能是防火墙的问题。我一定会试试的。我是UDP套接字编程新手,所以我想确保自己至少走上了正确的轨道。非常感谢。
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();
    }

}
}