java Socket UDP 介绍

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。

UDP传输:
DatagramSocket:此类用来发送和接收数据报包的套接字。

DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

示:用于发送

public static void send() throws Exception{
		DatagramSocket ds = new DatagramSocket();//创建<span style="font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">套接字对象</span>
		byte[] data = "udp haha".getBytes();//用于发送的数据
		DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 10000);//向本机的10000端口发送
		ds.send(dp);//发送
		ds.close();//关闭资源
	}
示:用于接收

public static void reciever() throws Exception {
<span style="white-space:pre">		</span>DatagramSocket ds = new DatagramSocket(10000);//创建套接字,并监听10000端口
		byte[] buf = new byte[1024];//用于存放接收的数据
		DatagramPacket dp = new DatagramPacket(buf, buf.length);//用于接收的数据报
		
		ds.receive(dp);//阻塞方法
		
		InetAddress address = dp.getAddress();
		System.out.println(address.getHostAddress());
		int port = dp.getPort();
		System.out.println(port);
		byte[] data = dp.getData();
		System.out.println(new String(data,0,dp.getLength()));		
	}

简单例子:

package UDP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ChatDemo {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {

			new Thread(new Rece(new DatagramSocket(10000))).start();
			new Thread(new Send(new DatagramSocket())).start();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

class Rece implements Runnable {
	private DatagramSocket ds;

	public Rece(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			byte[] b = new byte[1024];
			DatagramPacket p = new DatagramPacket(b, b.length);
			try {

				ds.receive(p);

				System.out.println(p.getAddress().getHostAddress() + "::"
						+ new String(p.getData(), 0, p.getLength()));

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

class Send implements Runnable {
	private DatagramSocket ds;

	public Send(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		BufferedReader br = null;

		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			String line = "";
			while ((line = br.readLine()) != null) {
				if ("line".equals("886")) {
					break;
				}
				byte[] b = line.getBytes();
				DatagramPacket p = new DatagramPacket(b, b.length,
						InetAddress.getByName("255.255.255.255"), 10000);
				ds.send(p);
			}
		} catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException("发送错误");
		} finally {
			if (ds != null) {
				ds.close();
			}
		}

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值