我刚刚用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字节的字节数组?提前致谢:]
答案 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()!!!