Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 广播服务器发现_Java_Sockets_Udp_Multicast_Service Discovery - Fatal编程技术网

Java 广播服务器发现

Java 广播服务器发现,java,sockets,udp,multicast,service-discovery,Java,Sockets,Udp,Multicast,Service Discovery,我正在用Java创建一个游戏,模拟经典的5张扑克牌,有2到4名玩家。 大部分数据将由服务器处理,但由于我不能使用在线服务器,我的想法是允许用户通过创建本地服务器来主持游戏 现在,我不想强制使用IP连接到游戏,所以我在用户可以看到所有可用游戏的界面中创建了一个“发现”界面。这是使用UDP协议和对公共组的广播研究来完成的: (代码简化为仅显示已执行的操作,可能无法按此处显示的方式工作) 客户端 MulticastSocket socket = new MulticastSocket(6020); I

我正在用Java创建一个游戏,模拟经典的5张扑克牌,有2到4名玩家。 大部分数据将由服务器处理,但由于我不能使用在线服务器,我的想法是允许用户通过创建本地服务器来主持游戏

现在,我不想强制使用IP连接到游戏,所以我在用户可以看到所有可用游戏的界面中创建了一个“发现”界面。这是使用UDP协议和对公共组的广播研究来完成的:

(代码简化为仅显示已执行的操作,可能无法按此处显示的方式工作)

客户端

MulticastSocket socket = new MulticastSocket(6020);
InetAddress group = InetAddress.getByName("226.0.0.1");
socket.joinGroup(group);

DatagramPacket packet = new DatagramPacket(new byte[] {(byte) 0xF0}, 1, group, 6020);
socket.send(packet);

while(true) {
    buf = new byte[1];
    packet = new DatagramPacket(buf, buf.length);
    socket.receive(packet);

    if(packet.getData()[0] == 15) {
        Socket client = new Socket(packet.getAddress(), 6020);
    }
}
服务器

MulticastSocket socket = new MulticastSocket(6020);
InetAddress group = InetAddress.getByName("226.0.0.1");
socket.joinGroup(group);

// new thread listening on port 6020 TCP
ServerSocket server = new ServerSocket(6020);
new Thread(new Runnable() {

            public void run() {
                while(true) {
                    // new thread communicating with client and back listening on port 6020
                    new ServerThread(server.accept());
                }
            }
}).start();

// listening on port 6020 UDP
byte[] buf;
DatagramPacket packet;
while(true) {
    buf = new byte[1];
    packet = new DatagramPacket(buf, buf.length);
    socket.receive(packet);

    if(packet.getData()[0] == -16) {
        DatagramPacket packet = new DatagramPacket(new byte[] {(byte) 0x0F}, 1, packet.getSocketAddress());
        socket.send(packet);
    }
}
客户端在端口6020上发送UDP广播数据包。当服务器接收到这个数据包(如果它是由字节0xF0组成)时,他会向客户端发回一个字节0x0F。每个客户端也在侦听端口6020,当接收到由字节0x0F组成的数据包时,它将启动到端口6020上服务器的新TCP连接

我的问题是:有没有更好的方法来实现这个“发现”系统?
我知道这只适用于本地网络,是否可以使用本地服务器将发现扩展到“外部”?

除非你想建立某种已知的代理,将玩家与服务器连接起来(或给他们一个服务器列表),否则你可能会走运。正如您所发现的,大多数交换机通常不会将多播和广播发送到WAN(而且肯定无法穿越Internet)

如果您在设置一个已知的服务器/代理时遇到的问题是您有一个家庭连接和一个动态ip,那么我建议您研究动态DNS。有许多提供商将允许您在其系统上设置子域,该子域会随着您的IP更改而自动更改为指向您的IP