【问题标题】:Java UDP ConnectionJava UDP 连接
【发布时间】:2015-04-25 08:30:04
【问题描述】:

我正在使用 Netbeans IDE 尝试在客户端和服务器之间建立 UDP 连接,这是一个简单的程序,UDPClient 将字符串发送到 UDPServer 并且服务器将大写字符串并将其发送回客户端。我将客户端和服务器端放在一个单独的项目中。

我的客户UDPClient的课程代码:

    package udpclient;


    import java.io.*;
    import java.net.*;

    public class UDPClient {

        public static void main(String[] args) throws IOException{

            //get input from user
            BufferedReader user_in = new BufferedReader(
                    new InputStreamReader(System.in));

            //create udp socket connection
            DatagramSocket socket = new DatagramSocket();

            //creat buffers to process data
            byte[] inData = new byte[1024];
            byte[] outData = new byte[1024];

            //get ip destination wanted
            InetAddress IP = InetAddress.getByName("localhost");

            //read data from user
            System.out.println("Enter Data to send to server: ");
            outData = user_in.readLine().getBytes();


            /*
             * make pkts for interaction
             */
            //send pkts
            DatagramPacket sendPkt = new DatagramPacket(outData, outData.length, IP, 9876);
            socket.send(sendPkt);

            //receive pkts
            DatagramPacket recievePkt = new DatagramPacket(inData, inData.length);
            socket.receive(recievePkt);

            System.out.println("Replay from Server: "+recievePkt.getData());

        }
    }

和我的服务器端类UDPServer:

    package udpserver;

    import java.io.*;
    import java.net.*;

    public class UDPServer {


        public static void main(String[] args) throws IOException{
            // TODO code application logic 
            //connection
            DatagramSocket socket = new DatagramSocket();

            //pkt buffers
            byte[] inServer = new byte[1024];
            byte[] outServer = new byte[1024];

            //receive pkt
            DatagramPacket rcvPkt = new DatagramPacket(inServer,inServer.length);
            socket.receive(rcvPkt);
            //display receive
            System.out.println("Packet Received!");


            //retrive pkt info to send response to same sender
            InetAddress IP = rcvPkt.getAddress();
            int port = rcvPkt.getPort();

            //process data
            String temp = new String(rcvPkt.getData());
            temp = temp.toUpperCase();
            outServer = temp.getBytes();

            //send response packet to sender
            DatagramPacket sndPkt = new DatagramPacket(outServer, outServer.length, IP, port);
            socket.send(sndPkt);

        }
    }

计算程序运行正常且没有输出错误。服务器根本没有收到数据包,它没有与客户端交互。为什么会这样?

【问题讨论】:

  • 那么您的客户端可能有错误的 IP 和/或端口。
  • 我尝试将localhost 更改为某个IP 地址同样的问题,但我明白了。可能我的 PC 机器网络 ip 设置需要配置。比Q
  • 没有 UDP 连接之类的东西。它是一个无连接协议。

标签: java sockets netbeans network-programming udp


【解决方案1】:

您尚未在服务器中指定任何侦听端口,因此服务器侦听随机可用端口。

在服务器端试试这个

DatagramSocket socket = new DatagramSocket(9876);

【讨论】:

    【解决方案2】:

    问题是您的服务器代码没有指定端口 - 它会侦听随机可用端口,而客户端发送到 9876。要更正此问题,请使用:

    DatagramSocket socket = new DatagramSocket(9876, InetAddress.getByName("localhost"));
    

    (如果您使用的是 linux 系统)我强烈建议您使用 netstat 来调试此类代码:

    netstat -ln | grep 9876
    

    会告诉你进程是否正在监听端口 9876。 另一个有用的工具是netcat,可以用来发送和接收TCP和UDP:

    nc -u localhost 9876
    

    允许您通过 UDP 向服务器发送消息。

    在您的客户端代码中,您还需要将接收到的字节转回字符串以获得有意义的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2012-08-12
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多