2015-04-25 42 views
4

我使用NetBeans IDE试图使客户端和服务器之间的UDP连接,这是一个简单的程序,UDPClient发送一个字符串到UDPServer和服务器利用字符串,并将其发送回client.I使客户端和服务器端在一个单独的项目中。客户端UDPClientJava的UDP连接

我的类代码:

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); 

     } 
    } 

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

+0

那么你可能在你的客户端有一个不好的IP和/或端口。 – libik

+0

我试图改变'localhost'到一个特定的IP地址相同的问题,但我有你的想法。可能我的PC机网络ip设置需要配置。比Q –

+3

有没有这样的事情作为UDP连接。这是一个无连接协议。 – EJP

回答

3

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

尝试此服务器端

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报文发送到服务器。

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