网络编程UDP的一些基本操作应用

UDP的特点
1、将数据及源和目的封装为数据包,不需要建立连接
2、每个包数据的大小限制为64k
3、因为无连接,所以是不可靠的协议
4、不需要建立连接速度快

UDP的应用
qq聊天、网络视频。
udp简单演示

示例1

udp的接收端

<span style="font-size:18px;"><span style="font-size:18px;">import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

class UDP_Rece_Demo01 {

	<span style="color:#33cc00;">/**
	 * 定义一个应用程序,用于接受udp协议传输的数据并处理
	 * 
	 * 思路:
	 * 1、定义udpsocket服务,通常会监听一个端口,其实就是给这个接受网咯应用程序定义一个数字标识
	 * 		方便于明确哪些数据过来该应用程序可以处理
	 * 2、定义一个数据包,因为要存储接受到的字节数据,
	 * 因为数据包种有更多的功能提取字节数据中的不同数据信息
	 * 3、通过socket服务的receive方法将收到的数据存入已定义好的数据包中
	 * 4、通过数据包中的特有功能,将不同的数据取出,打印在控制台上
	 * 5、关闭资源
	 * @throws IOException 
	 */</span>
	public static void main(String[] args) throws IOException {
		<span style="color:#33cc00;">//第一步:创建udp socket,建立端点</span>
		DatagramSocket ds=new DatagramSocket(10000);<span style="color:#33cc00;">//指定监听端口</span>
		<span style="color:#009900;">//2、定义数据包,用于存储数据。</span>
		byte [] b=new byte[1024];
		DatagramPacket dp=new DatagramPacket(b,b.length);
		<span style="color:#009900;">//3、通过服务的receive方法将接受到的数据存入到数据包中</span>
		ds.receive(dp);
		<span style="color:#33cc00;">//4、通过数据包的方法获取其中的数据</span>
		String ip=dp.getAddress().getHostAddress();
		String data=new String(dp.getData(),0,dp.getLength());
		int port=dp.getPort();
		System.out.println(ip+"---"+data+"----"+port);
		<span style="color:#33cc00;">//5、关闭资源</span>
		ds.close();

	}

}</span></span>
udp的发送端

<span style="font-size:18px;"><span style="font-size:18px;">import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

<span style="color:#33cc00;">/**
 * 需求,通过udp传输方式,将一段文字数据发送出去 
 * 思路 1、建立udpSocket服务 2、提供数据,并将数据封装到数据包中去
 * 3、通过Socket服务的发送功能,将数据包发送出去 4、关闭资源
 */</span>
public class UDP_Send_Demo01 {

	public static void main(String[] args) throws Exception {
		<span style="color:#33cc00;">// 1、创建udp服务,通过DaragramSocket对象</span>
		DatagramSocket ds = new DatagramSocket(8888);<span style="color:#33cc00;">// 指定发送端口</span>
		<span style="color:#009900;">// 2、确定数据,并封装成数据包</span>,

		byte[] buf = "今天十很好的天气".getBytes();<span style="color:#33cc00;">// 数据</span>
		DatagramPacket dp = new DatagramPacket(buf, buf.length,
				InetAddress.getByName("10.144.243.11"), 10000);
		<span style="color:#33cc00;">// 参数一:数据,参数二:数据长度,参数三:指定目的地的ip地址,参数四:端口号</span>

		<span style="color:#33cc00;">// 3、通过socket服务,建议有的数据包发送出去,通过send()方法</span>
		ds.send(dp);
		<span style="color:#33cc00;">// 4、关闭资源</span>
		ds.close();
	}

}</span></span>
示例2

udp发送端

<span style="font-size:18px;"><span style="font-size:18px;">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 UDP_Send_Demo02 {
<span style="color:#33cc00;">
	/**
	 * udp发送端02
	 * 
	 * @throws IOException
	 */</span>
	public static void main(String[] args) throws IOException {
		DatagramSocket ds = new DatagramSocket();

		BufferedReader bReader = new BufferedReader(new InputStreamReader(
				System.in));

		String s = null;
		
		while ((s = bReader.readLine()) != null) {<span style="color:#33cc00;">//循环输入数据发送给接收端当输入over时结束</span>
			if ("over".equals(s)) {
				break;
			}
			<span style="color:#33cc00;">// 将字符串转换为字节数组</span>
			byte[] buf = s.getBytes();
			DatagramPacket dp = new DatagramPacket(buf, buf.length,
					InetAddress.getByName("10.144.243.11"), 10002);
			
			ds.send(dp);
		}
		ds.close();
	}

}</span></span>
udp的接收端

<span style="font-size:18px;"><span style="font-size:18px;">import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

<span style="color:#33cc00;">/**
 * udp接受端02
 */</span>
public class UDP_Rece_Demo02 {

	
	public static void main(String[] args) throws IOException {
			
		DatagramSocket ds=new DatagramSocket(10002);
		
		
		while (true) {<span style="color:#33cc00;">//循环接受发送端发过来的数据</span>
			 byte [] buf=new byte[1024];
			 DatagramPacket dp=new DatagramPacket(buf, buf.length);
			 ds.receive(dp);
			 
			 String ip=dp.getAddress().getHostAddress();<span style="color:#009900;">//获取ip地址</span>
			 String data=  new String(dp.getData(),0,dp.getLength()) ;
			 
			 System.out.println(ip+"-------------"+data);
		}
	}

}</span></span>

示例3
udp练习

<span style="font-size:18px;"><span style="font-size:18px;">

package 网络编程;

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;

<span style="color:#33cc00;">/**
 * 编写一个聊天小程序, 有接收数据的部分,和发送数据的部分 
 * 这两部分需要同时执行,就需要用到多线程技术 
 * 一个用来控制接受,一个用来控制发送
 */
</span>
<span style="color:#33cc00;">// 发送端</span>
class Send implements Runnable {
	private DatagramSocket ds;//定义一个

	public Send(DatagramSocket ds) {<span style="color:#33cc00;">//定义一个构造方法,一初始化,就必须传送一个DatagramSocket对象	</span>
		this.ds = ds;
	}

	public void run() {
		BufferedReader bReader = new BufferedReader(new InputStreamReader(
				System.in));<span style="color:#33cc00;">//从键盘输入数据再将数据转换为字符流再加入字符流缓冲区</span>
		String s = null;

		try {
			while ((s = bReader.readLine()) != null) {<span style="color:#33cc00;">//循环读取键盘数据</span>

				if ("886".equals(s)) {
					System.out.println("sdfs");
					break;
				}

				DatagramPacket dp = new DatagramPacket(s.getBytes(),
						s.length(), InetAddress.getByName("10.144.243.11"),
						10002);
				ds.send(dp);
			}
			bReader.close();
			ds.close();
		} catch (Exception e) {

			e.printStackTrace();
		}

	}
}

<span style="color:#33cc00;">// 接收端</span>
class Rece implements Runnable {
	private DatagramSocket ds;

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

	public void run() {
		while (true) {

			try {
				byte[] b = new byte[1024];
				DatagramPacket dp = new DatagramPacket(b, b.length);
				ds.receive(dp);
				String ip = dp.getAddress().getHostAddress();
				String data = new String(dp.getData(), 0, dp.getLength());

				System.out.println(ip + "----------------" + data);
			} catch (Exception e) {

				e.printStackTrace();
			}
		}

	}

}

public class UDP_Demo01 {

	public static void main(String[] args) throws Exception {
		DatagramSocket send = new DatagramSocket();
		DatagramSocket rece = new DatagramSocket(10002);
		<span style="color:#33cc00;">//同时开启两个线程
</span>		new Thread(new Send(send)).start();
		new Thread(new Rece(rece)).start();
	}

}</span></span>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值