Java中的多线程UDP套接字编程

时间:2013-09-17 06:30:07

标签: java sockets udp inetaddress

我刚刚用Java设计了一个应用程序,可以使用一台服务器在多个客户端之间进行聊天。我使用UDP套接字和多线程。我对此有一些疑问:

客户端代码:

 private void sendMessage(String s) throws Exception  
    {
        byte b[] = s.getBytes();
        InetAddress address = InetAddress.getLocalHost();
        DatagramPacket packet = new DatagramPacket(b, b.length, address, PORT);
        socket.send(packet);
    }

根据here的回答:(我希望我没有误解)getLocalHost()方法应返回localhost环回地址。然而,它返回192.xxx.xx.xx,因为我已连接到网络。我对么 ?

我处理发送数据包的服务器端代码是:

 byte[] b = new byte[1024];
    while (true) 
    {
        try 
        {
            Arrays.fill(b, (byte)0);
            DatagramPacket packet = new DatagramPacket(b, b.length);
            socket.receive(packet);

            String content = new String(b, 0 , b.length);

            InetAddress clientAddress = packet.getAddress();
            int clientPort = packet.getPort();
            String id = clientAddress.toString() + ":" + clientPort;

当我打印ID时,它会给我:/192.168.56.1:64372 : GREETINGS。但是端口应该是我从客户端发送数据包的端口吗?如果没有,我做错了什么?最后,在发送一些数据包之后,我得到一个异常:java.lang.StringIndexOutOfBoundsException: String index out of range: 1046是不是因为1024字节的字节数组?提前致谢:]

1 个答案:

答案 0 :(得分:0)

好的,你有以下问题  1.接收端口不同  2.您获得IndexOutOfBounds异常

首先,我想java只是重新签名或者你的操作系统,但无论如何你都能正确地收到它!

到第二个。你真的不知道DatagramSocket存储数据的位置! 它可能是你的数组中的任何一个,因为数据包保护数据的偏移量和长度:

DatagramPacket p;
p.getLength()
p.getOffset()
p.getData()

所以这样做。

byte[] b = new byte[1024];
while (true) 
{
   try 
   {
      // This is not needed! Just check how much data you get
      // Arrays.fill(b, (byte)0);
      DatagramPacket packet = new DatagramPacket(b, b.length);
      socket.receive(packet);

      // This is the easiest
      String content = new String(packet.getData());

这仍然有点奇怪,因为你已经将所有数据设置为0而你的读数不超过1024 = b.length个字节。但是为了数据完整性,请使用getData()!!!