我刚刚用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()!!!