我刚刚用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()方法应该返回本地主机回送地址。但是,由于我已连接到网络,它会返回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.接收端口不同
2.您收到IndexOutOfBounds异常

首先,我想Java只是重新分配了它或您的os,但无论如何您都正确地接收了它!

到第二。您真的不知道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()!!!

10-01 02:07
查看更多