IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> UDP使用的整理 -> 正文阅读

[网络协议]UDP使用的整理

UDP使用的整理

Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。
(图都挂了,下次再补。。。。)

1.DatagramSocket的使用

DatagramSocket socket = new DatagramSocket();
DatagramSocket socket = new DatagramSocket(int port);
DatagramSocket socket = new DatagramSocket(SocketAddress address);
DatagramSocket socket = new DatagramSocket(int port,InetAddress address);
//Datagram的构造方法可以传入IP和端口等信息,也可以不传递(依然可以发送信息),
//里面的方法也大都是设置或者得到计算机ID,端口等信息的方法
//主要用来操作DatagramPacket报文类的是
socket.send(DatagramPacket packet);
socket.receive(DatagramPacket packet); 
//send用来发送报文,receive用来接受,
//注意:receive方法有线程阻塞效果,只有当接受到发送的报文后方法才会结束
//所以先启动最先要receive的类(服务端)
//再启动要Send的类(客户端)
//严格一点来说这也不是真正的客服端和服务端的关系
//如果双方都知道端口就可以直接相互发送信息

PS:SocketAddress是一个抽象类用来封装IP和端口(及InetAddress和Port)

2.DatagramPacket的使用

DatagramPacket packet = new DatagramPacket(byte[] buf,int length);
DatagramPacket packet = new DatagramPacket(byte[] buf,int offset,int length);
DatagramPacket packet = new DatagramPacket(byte[] buf,int length,SocketAddress adress);
DatagramPacket packet = new DatagramPacket(byte[] buf,int length,InetAddress address,int port);
DatagramPacket packet = new DatagramPacket(byte[] buf,int offset,int length,SocketAddress adress);
DatagramPacket packet = new DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port);
//以上是DatagramPacket的全部构造方法,共同点是都要设置一个字节数字用来存放数据,或者放入要发送的IP和端口(不传入IP和端口也可以用提供的set方法设置)就像一个快递员
//既然要用它传递信息,那么对信息的存取就是最重要的方法
packet.setData(byte[] bytes); //存放
packet.getData(); //拿取


3.DatagramSocket和DatagramPacket的配合使用,发送信息(单向)

客户端:发送信息

public class Client{
    public static void main(String[] args){
        DatagramSocket socket = new DatagramSocket();       //可以不设置发送的接口,则默认使用随机的接口
        DatagramPacket packet = new DatagramPacket(new byte[1024*8],1024*8);
        packet.setPort(9090);         //设置接受接口
        packet.setInetAddress(InteAddress.getLoaclHost());
        packet.setData("你好,服务器".getBytes(),0,"你好,服务器".getBytes().length);   //发送字符串
        socket.send(packet);               //发送
        socket.close()
    }
}

服务端:接受信息

public class Server{
	public static void main(String[] args){
		DatagramSocket socket = new DatagramSocket(9090);
		DatagramPacket packet = new DatagramPacket(new bytes[1024*8],1024*8);
		socket.receive(packet);
		System.out.println(new String(packet.getData()));     //显示发送的信息
         socket.close();
	}
}

先运行服务端再运行客户端,则可以看到输出结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MM7Sjtc-1630306141872)(C:\Users\ASUS\Pictures\pic.png)]

4.DatagramSocket和DatagramPacket的配合使用:发送信息(双向)

客户端:Client

public class Client{
    public static void main(String[] args){
        DatagramSocket socket = new DatagramSocket(6666);       //设置端口让服务端发送信息过来
        DatagramPacket packet = new DatagramPacket(new byte[1024*8],1024*8);
        packet.setPort(9090);         //设置接受接口
        packet.setInetAddress(InteAddress.getLoaclHost());
        packet.setData("你好,服务器".getBytes(),0,"你好,服务器".getBytes().length);   //发送字符串
        socket.send(packet);               //发送
        socket.receive(packet);                              //接受服务端信息并输出
        System.out.println(new String(packet.getData()));
        socket.close()
    }
}

服务端:Server

public class Server {
	public static void main(String[] args) throws IOException{
		DatagramSocket socket = new DatagramSocket(9090);
		DatagramPacket packet = new DatagramPacket(new byte[1024*8],1024*8);
		socket.receive(packet);
		System.out.println(new String(packet.getData()));
		packet.setPort(6666);               //设置客户端端口
		packet.setData("你好,客户端。".getBytes(),0,"你好,客户端。".getBytes().length); //向packet写入信息
		socket.send(packet);        //发送
        socket.close();
	}

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4MgKBoFQ-1630306141875)(C:\Users\ASUS\Pictures\pic1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyxtt7WR-1630306141877)(C:\Users\ASUS\Pictures\pic2.png)]

5.UDP和Swing的结合实现客户端和服务端的信息传递

服务端:Receiver

public class Receiver extends JFrame implements ActionListener,Runnable{  //实现动作监听和线程接口
	
	private Container con;
	
	private JTextField input;
	
	private JTextArea showMesseage;           //显示消息
	
	private JButton SendMes;
	
	private DatagramSocket client = new DatagramSocket(7845);//定义一个socket用于处理消息,并给个端口
	
	

	public Receiver() throws IOException{
		this.setTitle("接受方");
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setBounds(400, 300, 400, 300);
		this.setLayout(null);
		//基本属性设置
		
		con = this.getContentPane();
		input = new JTextField();
		showMesseage = new JTextArea();            
		SendMes = new JButton("发送");
		//初始化组件
		con.add(SendMes);con.add(input);con.add(showMesseage);
		SendMes.setBounds(0, 0, 400, 40);
		showMesseage.setBounds(0, 40, 400, 200);
		showMesseage.disable();
		input.setBounds(0, 240, 400, 30);
		SendMes.addActionListener(this);    //此类实现了ActionListener直接将this作为参数
		
		
		
	}
	@Override
	public void actionPerformed(ActionEvent e) {   //重写的监听方法
		byte[] bytes = new byte[1024*8];
		
		try {
			DatagramPacket packet = new DatagramPacket(bytes, 1024*8);
			packet.setAddress(InetAddress.getByName("localhost"));   //触发按钮创建报文
			packet.setPort(11001);                                  //设置端口并放入输入框的数据
			packet.setData(input.getText().getBytes(),0,input.getText().getBytes().length);
			client.send(packet);                                    //发送报文
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}	
	}
	@Override
	public void run() {	
		try {
			while(true) {                           //设置循环一直来接受客户端的消息
				byte[] bytes = new byte[1024*8];
				DatagramPacket packet = new DatagramPacket(bytes, 8*1024);
				client.receive(packet);            //接受客户端发送的报文
				String ss = packet.getAddress().getHostName()+ new String(packet.getData())+'\n';
				System.out.println(ss);
				showMesseage.append(ss);            //取出数据转化为字符串并放入窗体的文本域
			}
			
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	public static void main(String[] args) throws IOException {
		new Thread(new Receiver()).start();  //利用Thread创建对象并运行run方法
	}

}

客户端:UDPtest

public class UDPtest extends JFrame implements ActionListener,Runnable{
	
	private Container con;
	
	private JTextField input;
	
	private JTextArea showMesseage;
	
	private JButton SendMes;
	
	private DatagramSocket server = new DatagramSocket(11001);
    

	
	public UDPtest() throws SocketException{
		this.setTitle("发送方");
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setBounds(400, 300, 400, 300);
		this.setLayout(null);
		//基本属性设置
		
		con = this.getContentPane();
		input = new JTextField();
		showMesseage = new JTextArea();
		SendMes = new JButton("发送");
		//初始化组件
		con.add(SendMes);con.add(input);con.add(showMesseage);
		SendMes.setBounds(0, 0, 400, 40);
		showMesseage.setBounds(0, 40, 400, 200);
		showMesseage.disable();
		input.setBounds(0, 240, 400, 30);
		
		SendMes.addActionListener(this);
		
			
	}
	@Override
	public void actionPerformed(ActionEvent e) {  //触发按钮监听
		
		try {
			DatagramPacket packet = new DatagramPacket(new byte[1024*8], 8*1024);
            packet.setData(input.getText().getBytes());
            packet.setPort(7845);
            packet.setAddress(InetAddress.getLocalHost());
            server.send(packet);                                      //创建设置并给报文放入输入框的数据
            System.out.println(new String(packet.getData()));           //发送
			
			
		} catch (SocketException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
			
	}
	
	@Override
	public void run() {
		while(true) {
			
			try {                      //同上的注释
				DatagramPacket packet = new DatagramPacket(new byte[1024*8], 8*1024);
				server.receive(packet);
				String data = packet.getAddress().getHostName()+ new String(packet.getData())+'\n';
				showMesseage.append(data);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
	}
	public static void main(String[] args) throws SocketException {
		//UDPtest ui = new UDPtest();
		new Thread(new UDPtest()).start(); 
	}
	

}
/*
2021/7/21 23:00*/

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

	}
	
}
public static void main(String[] args) throws SocketException {
	//UDPtest ui = new UDPtest();
	new Thread(new UDPtest()).start(); 
}

}
/*
2021/7/21 23:00*/


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7bX2c8Rp-1630306141880)(C:\Users\ASUS\Pictures\pic3.png)]
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:49:47  更:2021-08-31 15:51:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:27:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码