java - 如何连接局域网 (LAN) 之外的 DatagramSocket 服务器和客户端?

标签 java networking network-programming server datagram

我能够在局域网 (LAN) 内连接 DatagramSocket 服务器和客户端,但无法在局域网之外连接。

这是我的代码:

GameServer 类:

public class GameServer extends Thread {

private DatagramSocket socket;

public GameServer() {
    try {
        this.socket = new DatagramSocket(7081,InetAddress.getByName("0.0.0.0"));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void run() {
    while (true) {
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        try {
            socket.receive(packet);
            if(new String(packet.getData()).trim().equalsIgnoreCase("ping")){
                sendData("pong".getBytes(),packet.getAddress(),packet.getPort());
            }
            System.out.println(new String(packet.getData()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


public void sendData(byte[] data, InetAddress ipAddress, int port) {

        DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, port);
        try {
            this.socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

}

GameClient 类:

public class GameClient extends Thread {

private InetAddress ipAddress;
private DatagramSocket socket;

public GameClient(String ipAddress) {
    try {
        this.socket = new DatagramSocket();
        this.ipAddress = InetAddress.getByName(ipAddress);
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
}

public void run() {
    while (true) {
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        try {
            socket.receive(packet);
            System.out.println(new String(packet.getData()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


public void sendData(byte[] data) {

        DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 7081);
        try {
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
    }
}

}

RunClient 类:

public class RunClient {
public static void main(String[] args) {
    GameClient client = new GameClient("/*Here is my external ip address*/"); //If i am running this for LAN then 192.168.1.67 and localhost work
    client.start();
    client.sendData("ping".getBytes());
}
}

RunServer 类:

public class RunServer {
public static void main(String[] args) {
    GameServer server = new GameServer();
    server.start();
}
}

这是我的端口转发配置:

Here are my port forwarding configurations

一些附加信息:
我的本地 IP 地址是 192.168.1.67
我使用的端口是7081
当我在 http://www.canyouseeme.org 检查我的 IP 和端口时它给了我以下错误:

Error: I could not see your service on "my external ip" on port (7081)

最佳答案

我没有发现您的代码有任何问题。该站点 ( http://www.canyouseeme.org ) 必须尝试使用​​ TCP 而不是 UDP。

关于java - 如何连接局域网 (LAN) 之外的 DatagramSocket 服务器和客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32233415/

相关文章:

java - Java程序-实现各种设置(选项)

windows - 如何避免http包合并?

Linux UDP 最大接收缓冲区大小

android - android的RRC状态

Java newColor 构造函数随机化

java - 如何使用 Keycloak Admin Java API 验证旧密码?

java - 如何在java中同时读取多行作为输入

c++ - 用于捕获 10 Gbps NIC 的 libpcap

java - 多播数据包未正确到达 podman 内部。已找到解决方法,但不清楚是防火墙问题还是 podman 问题?

c++ - async_read_until 在分隔符读取之前完成