【JavaSE】Java基础语法(四十五):TCP UDP 全解

news2024/12/25 9:14:04

文章目录

  • 1. TCP发送数据
  • 2. TCP接收数据【应用】
  • 3. TCP程序练习
  • 4. TCP程序文件上传练习【应用】
  • 5. UDP发送数据
  • 6. UDP接收数据【应用】
  • 7. UDP通信程序练习【应用】
  • 8. UDP三种通讯方式



在这里插入图片描述

1. TCP发送数据

  • Java中的TCP通信

    • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
    • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
  • 构造方法
    在这里插入图片描述

  • 相关方法
    在这里插入图片描述

  • 示例代码

public class ClientDemo {
	public static void main(String[] args) throws IOException {
		//创建客户端的Socket对象(Socket)
		//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
		Socket s = new Socket("127.0.0.1",10000);
		//获取输出流,写数据
		//OutputStream getOutputStream() 返回此套接字的输出流
		OutputStream os = s.getOutputStream();
		os.write("hello,tcp,我来了".getBytes());
		//释放资源
		s.close();
	}
}

2. TCP接收数据【应用】

  • 构造方法: 创建绑定到指定端口的服务器套接字
ServletSocket(int port)
  • 相关方法:监听要连接到此的套接字并接受它
Socket accept() 
  • 注意事项

    1. accept方法是阻塞的,作用就是等待客户端连接
    2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
    3. 针对客户端来讲,是往外写的,所以是输出流
      针对服务器来讲,是往里读的,所以是输入流
    4. read方法也是阻塞的
    5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
    6. 最后一步断开连接,通过四次挥手协议保证连接终止

  • 三次握手和四次挥手

    • 三次握手
    • 四次挥手

3. TCP程序练习

案例需求
客户端:发送数据,接受服务器反馈
服务器:收到消息后给出反馈

案例分析
客户端创建对象,使用输出流输出数据
服务端创建对象,使用输入流接受数据
服务端使用输出流给出反馈数据
客户端使用输入流接受反馈数据

代码实现

// 客户端
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",10000);
		OutputStream os = socket.getOutputStream();
		os.write("hello".getBytes());
		// os.close();如果在这里关流,会导致整个socket都无法使用
		socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何
		影响
		BufferedReader br = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
		String line;
		while((line = br.readLine())!=null){
			System.out.println(line);
		}
		br.close();
		os.close();
		socket.close();
	}
}

// 服务器
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket accept = ss.accept();
		InputStream is = accept.getInputStream();
		int b;
		while((b = is.read())!=-1){
			System.out.println((char) b);
		}
		System.out.println("看看我执行了吗?");
		BufferedWriter bw = new BufferedWriter(new
		OutputStreamWriter(accept.getOutputStream()));
		bw.write("你谁啊?");
		bw.newLine();
		bw.flush();
		bw.close();
		is.close();
		accept.close();
		ss.close();
	}
}

4. TCP程序文件上传练习【应用】

案例需求
客户端:数据来自于本地文件,接收服务器反馈
服务器:接收到的数据写入本地文件,给出反馈

案例分析
- 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出
结束后使用shutdownOutput()方法告知服务端传输结束
- 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,
传输结束后。使用输出流给客户端反馈信息
- 客户端接受服务端的回馈信息

相关方法
在这里插入图片描述

代码实现

// 客户端
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",10000);
		//是本地的流,用来读取本地文件的.
		BufferedInputStream bis = new BufferedInputStream(new
		FileInputStream("socketmodule\\ClientDir\\1.jpg"));
		//写到服务器 --- 网络中的流
		OutputStream os = socket.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(os);
		int b;
		while((b = bis.read())!=-1){
			bos.write(b);//通过网络写到服务器中
		}
		bos.flush();
		//给服务器一个结束标记,告诉服务器文件已经传输完毕
		socket.shutdownOutput();
		BufferedReader br = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
		String line;
		while((line = br.readLine()) !=null){
			System.out.println(line);
		}
		bis.close();
		socket.close();
	}
}
// 服务器
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket accept = ss.accept();
		//网络中的流,从客户端读取数据的
		BufferedInputStream bis = new
		BufferedInputStream(accept.getInputStream());
		//本地的IO流,把数据写到本地中,实现永久化存储
		BufferedOutputStream bos = new BufferedOutputStream(new
		FileOutputStream("socketmodule\\ServerDir\\copy.jpg"));
		int b;
		while((b = bis.read()) !=-1){
			bos.write(b);
		}
		BufferedWriter bw = new BufferedWriter(new
		OutputStreamWriter(accept.getOutputStream()));
		bw.write("上传成功");
		bw.newLine();
		bw.flush();
		bos.close();
		accept.close();
		ss.close();
	}
}

5. UDP发送数据

  • Java中的UDP通信

    • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个
      Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客
      户端和服务器的概念
    • Java提供了DatagramSocket类作为基于UDP协议的Socket
  • 构造方法
    在这里插入图片描述

  • 相关方法
    在这里插入图片描述

  • 发送数据的步骤
    - 创建发送端的Socket对象(DatagramSocket)
    - 创建数据,并把数据打包
    - 调用DatagramSocket对象的方法发送数据
    - 关闭发送端

  • 代码演示

    public class SendDemo {
    	public static void main(String[] args) throws IOException {
    		//创建发送端的Socket对象(DatagramSocket)
    		// DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
    		DatagramSocket ds = new DatagramSocket();
    		//创建数据,并把数据打包
    		//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    		//构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
    		byte[] bys = "hello,udp,我来了".getBytes();
    		DatagramPacket dp = new
    		DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),10086);
    		//调用DatagramSocket对象的方法发送数据
    		//void send(DatagramPacket p) 从此套接字发送数据报包
    		ds.send(dp);
    		//关闭发送端
    		//void close() 关闭此数据报套接字
    		ds.close();
    	}
    }
    

6. UDP接收数据【应用】

  • 接收数据的步骤

    • 创建接收端的Socket对象(DatagramSocket)
    • 创建一个数据包,用于接收数据
    • 调用DatagramSocket对象的方法接收数据
    • 解析数据包,并把数据在控制台显示
    • 关闭接收端
  • 构造方法
    在这里插入图片描述

  • 相关方法
    在这里插入图片描述

  • 示例代码

    public class ReceiveDemo {
    	public static void main(String[] args) throws IOException {
    		//创建接收端的Socket对象(DatagramSocket)
    		DatagramSocket ds = new DatagramSocket(12345);
    		//创建一个数据包,用于接收数据
    		byte[] bys = new byte[1024];
    		DatagramPacket dp = new DatagramPacket(bys, bys.length);
    		//调用DatagramSocket对象的方法接收数据
    		ds.receive(dp);
    		//解析数据包,并把数据在控制台显示
    		System.out.println("数据是:" + new String(dp.getData(), 0,
    		dp.getLength()));
    		}
    	}
    }
    

7. UDP通信程序练习【应用】

  • 案例需求

    • UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
    • UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
  • 代码实现

    /*
    	UDP发送数据:
    	数据来自于键盘录入,直到输入的数据是886,发送数据结束
    */
    public class SendDemo {
    	public static void main(String[] args) throws IOException {
    		//创建发送端的Socket对象(DatagramSocket)
    		DatagramSocket ds = new DatagramSocket();
    		//键盘录入数据
    		Scanner sc = new Scanner(System.in);
    		while (true) {
    			String s = sc.nextLine();
    			//输入的数据是886,发送数据结束
    			if ("886".equals(s)) {
    				break;
    			}
    			//创建数据,并把数据打包
    			byte[] bys = s.getBytes();
    			DatagramPacket dp = new DatagramPacket(bys, bys.length,
    			InetAddress.getByName("192.168.1.66"), 12345);
    			//调用DatagramSocket对象的方法发送数据
    			ds.send(dp);
    		}
    		//关闭发送端
    		ds.close();
    	}
    }
    
    /*
    	UDP接收数据:
    	因为接收端不知道发送端什么时候停止发送,故采用死循环接收
    */
    public class ReceiveDemo {
    	public static void main(String[] args) throws IOException {
    		//创建接收端的Socket对象(DatagramSocket)
    		DatagramSocket ds = new DatagramSocket(12345);
    		while (true) {
    			//创建一个数据包,用于接收数据
    			byte[] bys = new byte[1024];
    			DatagramPacket dp = new DatagramPacket(bys, bys.length);
    			//调用DatagramSocket对象的方法接收数据
    			ds.receive(dp);
    			//解析数据包,并把数据在控制台显示
    			System.out.println("数据是:" + new String(dp.getData(), 0,
    			dp.getLength()));
    		}
    		//关闭接收端
    		// ds.close();
    	}
    }
    

8. UDP三种通讯方式

  • 单播
    单播用于两个主机之间的端对端通信
  • 组播
    组播用于对一组特定的主机进行通信
  • 广播
    广播用于一个主机对整个局域网上所有主机上的数据通信



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python删除文件目录

Python删除文件目录 Python是一种高级编程语言,广泛应用于开发各种类型的应用程序。Python的许多功能使其成为开发者的首选编程语言之一。在这篇文章中,我们将讨论如何使用Python删除文件和目录。 文件和目录的区别 在开始之前,让我们了解…

16_Linux内核启动流程

目录 链接脚本vmlinux.Ids Linux内核入口stext mmap_switched函数 start_kernel函数 rest_init函数 init进程 链接脚本vmlinux.Ids 要分析Linux启动流程,同样需要先编译一下Linux源码,因为有很多文件是需要编译才会生成的。首先分析Linux内核的连接脚本文件arch/arm/kem…

【Python】Python系列教程-- Python3 字符串(十一)

文章目录 前言Python3 字符串Python 访问字符串中的值Python 字符串更新Python 转义字符Python 字符串运算符Python 字符串格式化Python三引号f-stringUnicode 字符串Python 的字符串内建函数 前言 往期回顾: Python系列教程–Python3介绍(一&#xff…

计算机网络-网络层1.0

传输单位 网络层将分组从源端传到目的端,为分组交换网上的不同主机提供通信服务,传输单位为数据报 路由器 完成路由选择和分组转发 路由选择:按照分布式算法,根据从相邻路由器所得到的的关于整个网络拓扑的变化情况&#xff0…

操作系统第二章​练习题

第一部分 教材习题(P84) 1、什么是前趋图?为什么要引入前趋图?​ 前趋图:是用于描述程序段或进程之间执行的先后顺序的有向无循环图。 引入的原因:为了更好的描述程序的顺序和并发执行的情况。 试画出下面4条语句的前趋图&#…

LeetCode 2559 统计范围内的元音字符串数

LeetCode 2559 统计范围内的元音字符串数 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目:…

Vue3小兔鲜:组合式写法入门

Vue3&#xff1a;组合式写法入门 Date: May 11, 2023 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> imp…

【JavaSE】Java基础语法(四十四):XML解析

文章目录 1. 概述2.标签的规则3. 语法规则【应用】4. xml解析【应用】 1. 概述 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域…

【分布族谱】高斯分布和逆高斯分布的关系

文章目录 高斯分布逆高斯分布简介通过高斯分布构造逆高斯分布 高斯分布 正态分布&#xff0c;又称Gauss分布&#xff0c;其概率密度函数入下图所示 正态分布 N ( μ , σ ) N(\mu, \sigma) N(μ,σ)受到期望 μ \mu μ和方差 σ 2 \sigma^2 σ2的调控&#xff0c;其概率密度函…

基于SpringBoot+Vue的医疗服务系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Qt for Android环境配置(联合Android Studio)

目录 1.安装JDK2.安装Android Studio并下载必要组件3.安装QtCreator并配置 Official Doc 1.安装JDK Oracle JDK Download 配置环境变量&#xff1a; 2.安装Android Studio并下载必要组件 Android Studio Download 下图中&#xff0c;31.0.0是当前Qt必需的&#xff0c;3…

chatgpt赋能python:Python制作抽奖——让你的活动更有趣

Python制作抽奖——让你的活动更有趣 在活动中&#xff0c;抽奖环节常常是一大亮点。而用Python制作抽奖程序&#xff0c;则可以更灵活、更实用地完成这个环节。接下来我们将介绍Python制作抽奖的方法&#xff0c;并且说明如何让你的抽奖环节更加有趣。 Python制作抽奖的方法…

【Linux网络服务】Nginx优化

Nginx网页优化 一、配置Nginx网页缓存时间1.1设置方法 二、隐藏Nginx版本号2.1方法一&#xff1a;修改配置文件2.2方法二&#xff1a;修改源码文件&#xff0c;重新编译 三、修改用户与组四、日志切割五、连接超时六、更改进程数七、网页压缩八、配置防盗链九、Linux内核参数优…

华为OD机试真题 Java 实现【素数之积】【2022Q4 100分】

一、题目描述 RSA加密算法在网络安全世界中无处不在&#xff0c;它利用了极大整数因数分解的困难度&#xff0c;数据越大&#xff0c;安全系数越高。 给定一个32位正整数&#xff0c;请对其进行因数分解&#xff0c;找出是哪两个素数的乘积。 二、输入描述 一个正整数num …

基于物理信息的神经网络(Physics-informed Neural Networks;PINNs)Part-1(简单介绍)

【摘要】 基于物理信息的神经网络&#xff08;Physics-informed Neural Networks&#xff0c;简称PINNs&#xff09;&#xff0c;是一类用于解决有监督学习任务的神经网络&#xff0c;它不仅能够像传统神经网络一样学习到训练数据样本的分布规律&#xff0c;而且能够学习到数学…

段的概念-汇编复习(3)

本文小节讨论内容&#xff1a;"段地址x16偏移地址物理地址”的本质含义,段 的 概 念 "段地址x16偏移地址物理地址”的本质含义 注意&#xff0c;这里讨论的是 8086CPU 段地址和偏移地址的本质含义&#xff0c;而不是为了解决具体的问题而在本质含义之上引申出来的更…

Node.js基本概念、特点、用途和常用模块,以及Express框架开发一个web应用

目录 一、Node.js的基本概念和特点 二、Node.js的用途 三、Node.js的常用模块 四、使用Node.js进行Web开发 1. 安装Node.js 2. PyCharm配置Node.js 3. 使用http库编写一个web服务 4. 使用Express框架构建Web应用程序 5. 调试代码 6. 发布应用程序 参考文章 Node.js是…

[转载]Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等

需求 统计静态文件的下载次数&#xff1b;判断用户是否有下载权限&#xff1b;根据用户指定下载速度&#xff1b;根据Referer判断是否需要防盗链&#xff1b;根据用户属性限制下载速度&#xff1b; X-Accel-Redirect This allows you to handle authentication, logging or …

基于vue3全新后台管理方案vite4+vue3+pinia2+vue-i18n

Vite4-Admin 基于 vue3vite4.xpinia2vue-router4 构建后台管理系统。 支持vue-i18n国际化多语言、动态路由鉴权、4种布局模板及tab页面缓存等功能。 技术框架 编码器&#xff1a;VScode框架技术&#xff1a;vite4vue3piniavue-routerUI组件库&#xff1a;ve-plus (基于vue3自研…

PHP快速实战19-PHP使用IMAP获取QQ邮箱的收件列表及内容

文章目录 前言关于IMAP协议安裝与实现步骤1&#xff1a;安装IAMP扩展1.1 检查IMAP是否已安装1.2 安装IMAP扩展1.3 启用IMAP扩展1.4 重启服务 步骤2&#xff1a;开始功能实现2.1 开始编码2.2 代码执行 常见的20个PHP中IMAP方法总结 前言 本文已收录于PHP全栈系列专栏&#xff1…