javaudp-数据包发送问题
每次我尝试将UDP数据包发送到某个地址时,都会出现以下异常: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
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");