3

我刚刚用 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);
    }

根据这里的回答:(我希望我没有误解它) 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 大小的字节数组吗?提前致谢 :]

4

1 回答 1

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() !!!

于 2013-10-04T15:20:58.010 回答