Java笔记之 UDP通信之 DatagramSocket DatagramPacket

前言

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();
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值