java Udp实现简单地发送接收信息

首先我们得知道 DatagramSocket、DatagramPacket这两个类

DatagramSocket

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

DatagramPacket
此类表示数据报包,因为Udp发送的是数据包。

InetSocketAddress
供套接字用于绑定、连接或用作返回值。就是地址


代码实现:

UdpSender(发送方)

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;

public class UdpSender {

	public static void main(String[] args) {
		SocketAddress local_addr = new InetSocketAddress("localhost", 9090);//发送方地址
		try {
			DatagramSocket sender = new DatagramSocket(local_addr);//发送对象
			int count = 0;//设置消息数
			while(count<100){
				count++;
				byte[] buf = (count+"hello").getBytes();//信息byte
				SocketAddress receive_addr = new InetSocketAddress("localhost",8081);//接收方地址
				DatagramPacket data = new DatagramPacket(buf, buf.length, receive_addr);//数据包
				try {
					sender.send(data);//发送消息
					System.out.println("send "+count+" ---- message");
					Thread.sleep(1000);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			sender.close();
		} catch (SocketException e) {
			e.printStackTrace();
		}
		
	}
}


UdpReceiver(接收方)

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;

public class UdpReceiver {

	public static void main (String[] args){
		SocketAddress local_addr = new InetSocketAddress("localhost", 8081);//接收方地址
		try {
			DatagramSocket receiver = new DatagramSocket(local_addr);//接收对象
			while(true){
				byte[] buf =new byte[10];
				DatagramPacket data = new DatagramPacket(buf, buf.length);//接收数据包对象
				receiver.receive(data);
				String msg = new String(data.getData());
				System.out.println("receive"+msg+"from"+data.getAddress());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
}
输出:

send 1 ---- message
send 2 ---- message
send 3 ---- message
send 4 ---- message
send 5 ---- message


不需要建立连接直接可以发送或接收。。。

不过在接受方创建byte数组时,不会预知其大小,如果自己定义还是大一些好,不然会丢失消息,

但是弊端就是多余的会以输出结果中的方格显示。。。

小结:

一般的在接触Udp(面向非连接)之前都会了解Tcp(面向连接),这两个肯定会有对比

在这里说下自己的理解,

 在 java中Tcp建立需要一个ServerSocket对象然后获取InputStream 和 OutputStream 对象,就可以实现通信,

其实Udp中的DatagramSocket和ServerSocket可以一样理解,只是它不需要建立连接,传送方式是数据包而不是字节数组。

当然,这些理解都只是些皮毛,以后在通信项目中还会遇更多、更复杂的问题,因为往往在一个项目中同时会应用两种

协议(比如QQ)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值