前言
java.io中的UDP与TCP的区别
java.io中的UDP通信没有Stream, 数据载体是DatagramPacket
UDP的DatagramSocket相当于TCP的ServerSocket
发送时UDP通过DatagramPacket指定对侧地址,而TCP通过Socket指定对侧地址
UDP无连接,每次发送都要指定对侧地址, TCP有连接,地址固定
DatagramSocket
公开的构造方法
- DatagramSocket()
- DatagramSocket(SocketAddress bindaddr)
- DatagramSocket(int port)
- DatagramSocket(int port, InetAddress laddr)
不指定端口就是端口0
public DatagramSocket() throws SocketException {
this(new InetSocketAddress(0));
}
端口号 0 是一个预留的端口号,代表的意思就是它在TCP或者UDP网络传输中应该不会被用到。但是在网络编程中,尤其是在unix socket编程当中,它有一些特殊的含义。在unix socket编程当中,端口号 0 是一种由系统指定动态生成的端口。
当建立新的TCP和UDP socket连接时,需要给它们指定端口号。 为了避免这种写死端口号的做法或者说为了从本地系统中找到可用端口。网络编程员们可以以端口号0来作为连接参数。这样的话操作系统就会从动态端口号范围内搜索接下来可以使用的端口号。windows系统和其他操作系统在处理端口号0时有一些细微的差别。
public DatagramSocket(SocketAddress bindaddr) throws SocketException {
this(createDelegate(bindaddr, DatagramSocket.class));
}
public DatagramSocket(int port) throws SocketException {
this(port, null);
}
public DatagramSocket(int port, InetAddress laddr) throws SocketException {
this(new InetSocketAddress(laddr, port));
}
DatagramPacket
DatagramPacket即用于发送也用于接收. 发送时要指定地址 . 接收时不用指定地址
用于接收时
用一个byte数组做缓冲 ,
在socket.receive(packet)之前
, packet.getLength()返回的是缓冲数组的长度
在receive()之后,getLength()返回的是收到数据的长度
int readLength =0;
readLength = rpacket.getLength();
System.out.println("readLength="+readLength); // buffer数组的长度
socket.receive(rpacket);
readLength = rpacket.getLength();
System.out.println("readLength="+readLength); // 收到数据的长度
例子
简单例子1
public static void main(String... auguments) throws Exception{
DatagramSocket socket = new DatagramSocket(666);
byte sendByteArray[] = "Hello 你好".getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendByteArray,
sendByteArray.length,
new InetSocketAddress("localhost", 666)); //可以自己发给自己
socket.send(sendPacket);
byte bf[] = new byte[3000];
DatagramPacket receivePacket = new DatagramPacket(bf, bf.length);
socket.receive(receivePacket);
int receiveLength = receivePacket.getLength();
byte receiveByteArray[] = new byte[receiveLength];
System.arraycopy(bf, 0, receiveByteArray, 0, receiveLength);
String receiveString = new String(receiveByteArray);
System.out.println(receiveString);
socket.close();
}