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();应该能收到数据吧,总之现在的问题就是啥都不输出,请帮忙看看,谢谢了。
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();应该能收到数据吧,总之现在的问题就是啥都不输出,请帮忙看看,谢谢了。
比如
PacketReceiver pc=new PacketReceiver();
Thread.sleep(2000);//try catch,等待服务端完全开启
PacketSender ps=new PacketSender();
试一试
//System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getAddress().getHostAddress()+":"+new String(buffer,0,packet.getLength()));//输出:127.0.0.1:data
故我改写了代码:
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通信时,数据接收端必须先执行进行接收数据。(不知道我上面说的对不对,希望指正)
另外谢谢你的指点。
与
System.out.println(new String(buffer,0,packet.getLength()));
的效果是一样的,本身packet.getData()与buffer是等价的。