为何我写的UDP无法在广域网上传输

UDP通信代码如下 :

客户端
public class ClientMsg extends Thread {

private static DatagramSocket datagramsocket ;
private static JTextArea jtextarea ;
private static Socket socket ;
private static ServerSocket server ;

public ClientMsg ( JTextArea textArea) {
    try {

// server = new ServerSocket(2022) ;
datagramsocket = new DatagramSocket();
}catch (IOException e) {
System.out.println( "访问出错,端口已被占用,请更换端口号");
}
ClientMsg.jtextarea = textArea ;
}

/*向服务器注册一下*/
public void reg ( String ip , int port ) {
    send (ip , port , "reguser") ;
    if ( this.getState() == State.NEW ) {
        this.start();
    }
}

//向服务器发送数据
public void send ( String ip , int port , String msg){
        byte[] b = msg.getBytes() ;
        try {
            DatagramPacket datagrampacket = new DatagramPacket( b , b.length , InetAddress.getByName(ip) , port);
            datagramsocket.send(datagrampacket);
            
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch ( IOException i ) {
            i.printStackTrace();
        }
}
//接送服务器反馈回来的数据 ,用线程循环接送
public void run () {
        try {
            byte[] b = new byte[1024*3] ;
            DatagramPacket datagrampacket = new DatagramPacket ( b , b.length ) ;
            datagramsocket.receive(datagrampacket);
            String s = new String ( datagrampacket.getData() , 0 , datagrampacket.getLength() ) ;
            String text = jtextarea.getText() ;
            jtextarea.setText(datagrampacket.getAddress().getHostAddress() + ":" + s + "\n" + text );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public static void main ( String[] ary ) {
    
}

}

服务端

public class UDPMSGserver extends Thread implements Serializable{

public UDPMSGserver (DatagramPacket datagrampacket ) {
    this.datagrampacket = datagrampacket ;
}

private DatagramPacket datagrampacket ;

private static DatagramSocket datagramsocket ;

private static ServerSocket server ;
private static Socket socket ;
public static String str ;

/* 登记用户的 IP 和 端口 */
private static HashSet< String > hashSet = new HashSet< String >() ;
//接送客户端发送过来的数据 , 循环接收
public static void operServer () throws IOException{
    try {
        datagramsocket = new DatagramSocket (666) ;
        while ( true ) { 
            try {
                byte[] b = new byte[1024*3 ] ;
                DatagramPacket datagrampacket1 = new DatagramPacket( b , b.length ) ;
                datagramsocket.receive(datagrampacket1);
                new UDPMSGserver(datagrampacket1).start(); ;
            }catch ( IOException i ) {
                System.out.println( " 接收数据时发生错误 " ) ; 
            }    
        }
    }catch ( IOException s ) {
        s.printStackTrace();
    }
}
public void run() {
    /* 将客户端数据转换成字符串 */
    String clientStr = new String ( datagrampacket.getData() , 0 , datagrampacket.getLength() ) ;
    /*注册接收端*/
    if ( clientStr.startsWith("reguser")) {
        String ip = datagrampacket.getAddress().getHostAddress() ;
        int port = datagrampacket.getPort() ;
        hashSet.add( ip + "," + port ) ;
    } else {

//返回数据给客户端
for ( String string : hashSet) {
String ip = string.split(",")[0] ;
int port = Integer.parseInt(string.split(",")[1]) ;
try {
DatagramPacket data = new DatagramPacket(datagrampacket.getData() , datagrampacket.getLength() , InetAddress.getByName(ip) , port ) ;
datagramsocket.send(data);
} catch ( UnknownHostException u ) {
System.out.println( "目标IP出现异常" );
}catch ( IOException I ) {
System.out.println("数据文件发生错误");
}

        }
    }
}

public static void main ( String[] ary ) {
    try {
        UDPMSGserver.operServer();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

个人意见:

  1. main函数是空的。没看出来哪里跑了客户端的线程。
  2. 如果使用的IP是B类地址,需要服务器端和客户端连同一个局域网才可以通信。也就是说这里用不到广域网的。
  3. 如果使用广域网的IP,可能存在丢包现象。
  4. 提问的代码块样式断断续续的,不是很好看。