代码之家  ›  专栏  ›  技术社区  ›  en Lopes

Java UDP服务器不工作

  •  1
  • en Lopes  · 技术社区  · 6 年前

    我创建了这个SpringBoot应用程序,探索通过用户数据报协议与Java进行网络通信。我正在Eclipse Java EE IDE中为Web开发人员运行该应用程序,版本:Oxygen。1a发布(4.7.1a)

    主要类别如下:

    @Override
        public void run(String... args) throws Exception {
    
            socket = new DatagramSocket(UDP_PORT); 
    
            byte[] receiveData = new byte[BUFFER_SIZE];
            byte[] sendData    = new byte[BUFFER_SIZE];
    
            LOG.info("UDP server init...");
    
            while (true) {
    
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);              
                socket.receive(receivePacket);  
    
                String sentence = new String( receivePacket.getData(), 0, receivePacket.getLength() );
    
                LOG.info("recived [" + sentence + "] from " + receivePacket.getAddress());
    
                InetAddress IPAddress = receivePacket.getAddress();
                int port = receivePacket.getPort();
    
                DatagramPacket sendPacket = new DatagramPacket(receiveData, receiveData.length, IPAddress, receivePacket.getPort());
                socket.send (sendPacket);
    
            }       
        }
    

    这里是我创建的用于测试服务器的客户端UDP类

    public class UDPClient {
    
    private final static int TCP_PORT = 5202;
    
        private DatagramSocket socket;
        private InetAddress address;
    
        private byte[] buf;
    
        public UDPClient() throws SocketException, UnknownHostException {
            socket = new DatagramSocket();  
            address = InetAddress.getByName("localhost");
        }
    
        public String sendEcho(String msg) throws IOException {
    
            buf = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(buf, buf.length, address, TCP_PORT);
            socket.send(packet);
            packet = new DatagramPacket(buf, buf.length);
            socket.receive(packet);
            String received = new String(packet.getData(), 0, packet.getLength());
    
            return received;
        }
    
        public void close() {
            socket.close();
        }
    
        public static void main(String[] args) throws IOException, InterruptedException {
                UDPClient udpClient = new UDPClient();
    
                for (;;) {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println
                        (udpClient.sendEcho("cullons"));
                }
        }
    
    }
    

    在我的计算机中工作正常,然后我将UDPServer部署到服务器上,我使用ipconfig获取ip

    IPv4地址………:214.146.86.201

    然后我将“localhost”替换为“214.146.86.201”,但我在服务器中没有收到任何消息。

    我已经做了 nc -vzu 214.146.86.201 5202 从我的计算机

    结果是:

     MacBook-Pro-de-lopes:$ nc -vzu 214.146.86.201 5202
    found 0 associations
    found 1 connections:
         1: flags=82<CONNECTED,PREFERRED>
        outif (null)
        src 192.166.26.140 port 56827
        dst 214.146.86.201 port 5202
        rank info not available
    
    Connection to 214.146.86.201 port 5202 [udp/*] succeeded!
    

    但服务器打印 无效的 在…上 LOG.info("socket InetAddres: " + socket.getInetAddress()); LOG.info("socket RemoteSocketAddress: " + socket.getRemoteSocketAddress());

    我也试过服务器 socket = new DatagramSocket(UDP_PORT, InetAddress.getByName("214.146.86.201")); 同样的结果

    1 回复  |  直到 6 年前
        1
  •  1
  •   zaerymoghaddam    6 年前

    最可能的问题可能是客户端无法访问服务器上的5202端口。端口及其可访问性可能与TCP不同,但无论如何,中间总是有人丢弃您的数据包。

    最简单的解决方法是尝试在服务器上运行客户端和服务器代码(214.146.86.201)。如果它可以连接,则意味着肯定存在通信问题,您可以使用所述的Netcat进行检查 here . 我自己没有试过。