javaudp-数据包发送问题

javaudp-数据包发送问题,java,network-programming,Java,Network Programming,每次我尝试将UDP数据包发送到某个地址时,都会出现以下异常: java.lang.ArrayIndexOutOfBoundsException at java.net.PlainDatagramSocketImpl.send(Native Method) at java.net.DatagramSocket.send(DatagramSocket.java:625) at services.servicetypes.network.host.Server_UDP_Thre

每次我尝试将UDP数据包发送到某个地址时,都会出现以下异常:

java.lang.ArrayIndexOutOfBoundsException
    at java.net.PlainDatagramSocketImpl.send(Native Method)
    at java.net.DatagramSocket.send(DatagramSocket.java:625)
    at services.servicetypes.network.host.Server_UDP_Thread_Monitor.send(Server_UDP_Thread_Monitor.java:84)
它直接指向套接字发送函数-this.socket.send(packet)

在数据报数据包上放置断点后,我得到以下信息:

packet  DatagramPacket  java.net.DatagramPacket@52c4c57 
byte[]  #1248(length=16)    
offset  int 0   
length  int 16  
bufLength   int 16  
address Inet4Address    /192.168.0.101  
Static          
Inherited   
port    int 3889
我不清楚为什么会发生这种情况,如果有人能解释一下这个问题,那就太好了。我最初的想法是,数据包中的一个元素可能是空的

(基本资料来源)

INetAddress信息:(Ip正确显示目标计算机)

服务器源

我怀疑这与使用缓冲的
DataOutputStream
然后传递底层的
字节[]
有关


创建数据包之前,请先尝试
out.flush()

错误不在您发布的部分中。我将您的源代码包装在一个示例程序中,它可以正常工作

package de.fencing_game.paul.examples;

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

/**
 */
public class UDPTest {

    private static class Gamer {
        int clientID;
        float x;
        float y;
        InetAddress address;

        public int getClientID() { return clientID; }
        public float getX() { return x; }
        public float getY() { return y; }
        public InetAddress getInetAddress() { return address; }
    }


    private DatagramSocket socket;


    public UDPTest() throws IOException
    {
        this.socket = new DatagramSocket();
    }


    public void sendPackage(Gamer gamerToSend)
        throws IOException
    {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(byteOut);

        // Game type
        out.writeInt(1);

        // Client
        out.writeInt(gamerToSend.getClientID());

        // Position
        out.writeFloat(gamerToSend.getX());
        out.writeFloat(gamerToSend.getY());

        DatagramPacket packet = new DatagramPacket
            (
                byteOut.toByteArray(),
                byteOut.size(),
                gamerToSend.getInetAddress(),
                3887
            );

        this.socket.send(packet);

        byteOut.close();
        out.close();
    }


    public static void main(String[] ignored)
        throws IOException
    {
        Gamer g = new Gamer();
        g.address = InetAddress.getByName("localhost");

        UDPTest sender = new UDPTest();
        sender.sendPackage(g);
    }

}
你有什么不同吗?

谢谢你的帮助

当手动将InetAddress设置到远程计算机时,它似乎在某个地方损坏,如下所示:

InetAddress addr = InetAddress.getByName("192.168.0.101");
工作非常好,所以我有更多的调试要做,但这就是问题所在


再次感谢您的帮助

你需要发布你的代码,这样我们才能看到你在做什么。抱歉,忘记了,添加了源代码。我已经尝试过了,但错误与以前相同。out.flush();DatagramPacket packet=new DatagramPacket….问题是,很明显,长度与您传递的字节[]不匹配。在数据包之前,执行一个
byte[]foo=byteOut.toByteArray()并将其作为大小传递给
foo.length
。或者只需将
byteOut.size()
与该长度进行比较,看看是否有差异;System.out.println(“1~”+字节输出.size());System.out.println(“2~”+foo.length);1~16 2~16没有区别……你写了16个字节,但是你的数据包只有13个字节(来自你发布的调试数据)。我的坏消息是我错误地添加了一些额外的数据。现在两个都显示16个字节,但问题仍然存在。请确保接受您自己的答案,这样问题就结束了。
package de.fencing_game.paul.examples;

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

/**
 */
public class UDPTest {

    private static class Gamer {
        int clientID;
        float x;
        float y;
        InetAddress address;

        public int getClientID() { return clientID; }
        public float getX() { return x; }
        public float getY() { return y; }
        public InetAddress getInetAddress() { return address; }
    }


    private DatagramSocket socket;


    public UDPTest() throws IOException
    {
        this.socket = new DatagramSocket();
    }


    public void sendPackage(Gamer gamerToSend)
        throws IOException
    {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(byteOut);

        // Game type
        out.writeInt(1);

        // Client
        out.writeInt(gamerToSend.getClientID());

        // Position
        out.writeFloat(gamerToSend.getX());
        out.writeFloat(gamerToSend.getY());

        DatagramPacket packet = new DatagramPacket
            (
                byteOut.toByteArray(),
                byteOut.size(),
                gamerToSend.getInetAddress(),
                3887
            );

        this.socket.send(packet);

        byteOut.close();
        out.close();
    }


    public static void main(String[] ignored)
        throws IOException
    {
        Gamer g = new Gamer();
        g.address = InetAddress.getByName("localhost");

        UDPTest sender = new UDPTest();
        sender.sendPackage(g);
    }

}
InetAddress addr = InetAddress.getByName("192.168.0.101");