一端UDP程序

hu0905074231 2012-04-15 07:32:53
import java.net.*;
public class MainClass4
{
public static void main(String[] args)
{
PacketSender ps=new PacketSender();
PacketReceiver pc=new PacketReceiver();

}
}
class PacketReceiver {
public static void main(String[] args) throws Exception {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
DatagramSocket socket = new DatagramSocket(5002);
socket.receive(packet);
System.out.println(packet.getSocketAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}

class PacketSender {

public static void main(String[] args) throws Exception {
byte[] buffer = "data".getBytes();
InetAddress addr=InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 5002);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
socket.close();
}
}

不知道我对UDP的理解哪里错了,上面这段程序编译没问题,运行什么都不输出就结束了,UDP不是面对连接的通信,也就是说
PacketSender ps=new PacketSender();
执行完后这个send socket关闭连接,但是数据是发送出去了呀,然后执行
PacketReceiver pc=new PacketReceiver();
应该能收到数据吧,总之现在的问题就是啥都不输出,请帮忙看看,谢谢了。
...全文
68 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdojqy1122 2012-04-16
  • 打赏
  • 举报
回复
你分析的很有道理。如果分成两个线程就不会出现卡在 socket.receive(packet);而不往下执行的尴尬。非常抱歉,考虑问题没周全。
hu0905074231 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

应该是服务器代码中new String()这里写错了,你在试试看。
//System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getAddress().getHostAddress()+":"+new String(buffer,0,packet.getLength()));//……
[/Quote]
不是这个问题,
 System.out.println(new String(packet.getData(),0,packet.getLength()));


 System.out.println(new String(buffer,0,packet.getLength()));

的效果是一样的,本身packet.getData()与buffer是等价的。
hu0905074231 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

先打开server,在打开client端,服务端要先开着吧
比如
PacketReceiver pc=new PacketReceiver();
Thread.sleep(2000);//try catch,等待服务端完全开启
PacketSender ps=new PacketSender();
试一试
[/Quote]
昨天我好好看了下这段程序,原来问题发生在线程方面,首先,我把PacketReceiver的接收端代码和PacketSender的发送代码写道了main()函数里面,这样,在MainClass4对PacketSender初始化完成并不执行发送代码,而是直接又去初始化PacketReceiver,然后直接跳出程序。程序结束。这个代码里面只有一个主线程。
故我改写了代码:
import java.net.*;
public class MainClass4
{
public static void main(String[] args) throws Exception
{
PacketSender ps=new PacketSender();
PacketReceiver pc=new PacketReceiver();

}
}
class PacketReceiver {
public PacketReceiver()throws Exception{
System.out.println("receive start");
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
DatagramSocket socket = new DatagramSocket(5002);
socket.receive(packet);
System.out.println(packet.getSocketAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
System.out.println("receive over");
}
}

class PacketSender {

public PacketSender() throws Exception{
System.out.println("sender start");
byte[] buffer = "data".getBytes();
InetAddress addr=InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 5002);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
socket.close();
System.out.println("sender over");
}
}

运行结果:
sender start
sender over
receive start

而这样写了代码之后,确实能确保发送代码和接受代码被执行,但是问题还是出来了,这里还是只有一个线程,在发送端发送完成后接受端代码才执行,这样就如您所说,必须先执行服务器端代码(接收代码),然后执行客户端代码。而我的程序是先执行了客户端,再执行了服务器端。我改了顺序后,代码如下:
import java.net.*;
public class MainClass4
{
public static void main(String[] args) throws Exception
{

PacketReceiver pc=new PacketReceiver();
PacketSender ps=new PacketSender();

}
}
class PacketReceiver {
public PacketReceiver()throws Exception{
System.out.println("receive start");
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
DatagramSocket socket = new DatagramSocket(5002);
socket.receive(packet);
System.out.println(packet.getSocketAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
System.out.println("receive over");
}
}

class PacketSender {

public PacketSender() throws Exception{
System.out.println("sender start");
byte[] buffer = "data".getBytes();
InetAddress addr=InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 5002);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
socket.close();
System.out.println("sender over");
}
}

运行结果:

receive start

结果程序卡在接收端代码:
  socket.receive(packet);

因为没有收到数据包,receive()方法阻塞,这个程序的问题仍旧是单线程的问题。
所以,这段程序要么分开成两部分,一部分为服务器端代码,单独执行,另一部分为客户端代码,单独执行。要么就必须使用多线程了。

总结:UDP通信时,数据接收端必须先执行进行接收数据。(不知道我上面说的对不对,希望指正)
另外谢谢你的指点。
hu0905074231 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你分析的很有道理。如果分成两个线程就不会出现卡在 socket.receive(packet);而不往下执行的尴尬。非常抱歉,考虑问题没周全。
[/Quote]
又解决了一个问题,可以结贴了。再次感谢回答。
a190169583 2012-04-15
  • 打赏
  • 举报
回复
应该是服务器代码中new String()这里写错了,你在试试看。
//System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getAddress().getHostAddress()+":"+new String(buffer,0,packet.getLength()));//输出:127.0.0.1:data
sdojqy1122 2012-04-15
  • 打赏
  • 举报
回复
先打开server,在打开client端,服务端要先开着吧
比如
PacketReceiver pc=new PacketReceiver();
Thread.sleep(2000);//try catch,等待服务端完全开启
PacketSender ps=new PacketSender();
试一试

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧