每天学一点之网络编程

news2025/7/20 9:45:04

网络编程

一、软件结构

C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷,百度网盘。
B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有IE、谷歌、火狐等。

网络编程,就是在一定的协议下,实现两台计算机的通信的程序。

二、网络通信协议

TCP/IP协议参考模型:内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
在这里插入图片描述

  • 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
  • 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。而IP协议是一种非常重要的协议。IP(internet protocal)又称为互联网协议。IP的责任就是把数据从源传送到目的地。它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
  • 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。TCP(Transmission Control Protocol)协议,即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务。
  • 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。

三、TCP与UDP协议

UDP:用户数据报协议(User Datagram Protocol)。

  • 非面向连的,不可靠的:UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
  • 大小限制的:数据被限制在64kb以内
  • 数据报(Datagram):网络传输的基本单位

TCP:传输控制协议 (Transmission Control Protocol)。

  • 面向连接的,可靠的:TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。是一种面向连接的、可靠的、基于字节流的传输层的通信协议,可以连续传输大量的数据。
  • TCP协议会采用“三次握手”方式让它们建立一个连接,用于发送和接收数据的虚拟链路。数据传输完毕TCP协议会采用“四次挥手”方式断开连接。

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

  • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

  • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

  • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。

四次挥手:TCP协议中,在发送数据结束后,释放连接时需要经过四次挥手。

  • 第一次挥手:客户端向服务器端提出结束连接,让服务器做最后的准备工作。此时,客户端处于半关闭状态,即表示不再向服务器发送数据了,但是还可以接受数据。
  • 第二次挥手:服务器接收到客户端释放连接的请求后,会将最后的数据发给客户端。并告知上层的应用进程不再接收数据。
  • 第三次挥手:服务器发送完数据后,会给客户端发送一个释放连接的报文。那么客户端接收后就知道可以正式释放连接了。
  • 第四次挥手:客户端接收到服务器最后的释放连接报文后,要回复一个彻底断开的报文。这样服务器收到后才会彻底释放连接。这里客户端,发送完最后的报文后,会等待2MSL,因为有可能服务器没有收到最后的报文,那么服务器迟迟没收到,就会再次给客户端发送释放连接的报文,此时客户端在等待时间范围内接收到,会重新发送最后的报文,并重新计时。如果等待2MSL后,没有收到,那么彻底断开。

多个客户端与服务器之间的多次通信

public class Client2 {
	public static void main(String[] args) throws Exception {
		// 1、准备Socket,连接服务器,需要指定服务器的IP地址和端口号
		Socket socket = new Socket("127.0.0.1", 8888);

		// 2、获取输出流,用来发送数据给服务器
		OutputStream out = socket.getOutputStream();
		PrintStream ps = new PrintStream(out);
		
		// 3、获取输入流,用来接收服务器发送给该客户端的数据
		InputStream input = socket.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(input));
		
		Scanner scanner = new Scanner(System.in);
		while(true){
			System.out.println("输入发送给服务器的单词或成语:");
			String message = scanner.nextLine();
			if(message.equals("stop")){
				socket.shutdownOutput();
				break;
			}
			
			// 4、 发送数据
			ps.println(message);
			// 接收数据
			String feedback  = br.readLine();
			System.out.println("从服务器收到的反馈是:" + feedback);
		}
		
		//5、关闭socket,断开与服务器的连接
		scanner.close();
		socket.close();
	}
}


public class Server2 {
	public static void main(String[] args) throws IOException {
		// 1、准备一个ServerSocket
		ServerSocket server = new ServerSocket(8888);
		System.out.println("等待连接...");
		
		int count = 0;
		while(true){
			// 2、监听一个客户端的连接
			Socket socket = server.accept();
			System.out.println("第" + ++count + "个客户端"+socket.getInetAddress().getHostAddress()+"连接成功!!");
			
			ClientHandlerThread ct = new ClientHandlerThread(socket);
			ct.start();
		}
		
		//这里没有关闭server,永远监听
	}
	static class ClientHandlerThread extends Thread{
		private Socket socket;

		public ClientHandlerThread(Socket socket) {
			super();
			this.socket = socket;
		}
		
		public void run(){
			
			try{
				//(1)获取输入流,用来接收该客户端发送给服务器的数据
				BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				//(2)获取输出流,用来发送数据给该客户端
				PrintStream ps = new PrintStream(socket.getOutputStream());
				String str;
				// (3)接收数据
				while ((str = br.readLine()) != null) {
					//(4)反转
					StringBuilder word = new StringBuilder(str);
					word.reverse();
					
					//(5)返回给客户端
					ps.println(word);
				}
				System.out.println(socket.getInetAddress().getHostAddress()+"正常退出");
			}catch(Exception  e){
				System.out.println(socket.getInetAddress().getHostAddress()+"意外退出");
			}finally{
				try {
					//(6)断开连接
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

UDP传输数据

public class Send {

	public static void main(String[] args)throws Exception {
//		1、建立发送端的DatagramSocket
		DatagramSocket ds = new DatagramSocket();
		
		//要发送的数据
		ArrayList<String> all = new ArrayList<String>();
		all.add("好好学习!");
		all.add("天天向上!");
		all.add("每天进步一点点!");
		all.add("早日就业!");
		
		//接收方的IP地址
		InetAddress ip = InetAddress.getByName("127.0.0.1");
		//接收方的监听端口号
		int port = 9999;
         //发送多个数据报
		for (int i = 0; i < all.size(); i++) {
//			2、建立数据包DatagramPacket
			byte[] data = all.get(i).getBytes();
			DatagramPacket dp = new DatagramPacket(data, data.length, ip, port);
//			3、调用Socket的发送方法
			ds.send(dp);
		}
		
//		4、关闭Socket
		ds.close();
	}
}

public class Receive {

	public static void main(String[] args) throws Exception {
//		1、建立接收端的DatagramSocket,需要指定本端的监听端口号
		DatagramSocket ds = new DatagramSocket(9999);
		
		//一直监听数据
		while(true){
	//		2、建立数据包DatagramPacket
			byte[] buffer = new byte[1024*64];
			DatagramPacket dp = new DatagramPacket(buffer , buffer.length);
			
	//		3、调用Socket的接收方法
			ds.receive(dp);
			
			//4、拆封数据
			String str = new String(buffer,0,dp.getLength());
			System.out.println(str);
		}
	}
}

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

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

相关文章

go语言踩坑大全

文章目录1.左大括号 { 不能单独放一行2.未使用的变量3.未使用的 import4.简短声明的变量只能在函数内部使用5.使用简短声明来重复声明变量6.不能使用简短声明来设置字段的值7.覆盖了变量差错8.显式类型的变量无法使用 nil 来初始化9.直接使用值为 nil 的 slice、map10.map 容量…

CFS三层靶机安装与配置

CFS三层靶机安装与配置 环境下载 百度网盘 提取码&#xff1a;Chen 环境安装 下载完成后&#xff0c;有三个文件夹&#xff0c;每个文件夹对应一个靶机 进入三个文件夹&#xff0c;双击打开后缀为.ovf的文件&#xff0c;按提示安装虚拟机 环境配置 网段划分 target1&#…

LCMXO3L-1300E-5MG121C/LCMXO3L-1300E-5MG121I【FPGA】LCMXO3L-1300E-5MG256I嵌入式器件

LCMXO3L-1300E-5MG121C/LCMXO3L-1300E-5MG121I【FPGA】LCMXO3L-1300E-5MG256I嵌入式器件【说明】MachXO3设备系列是一个超低密度系列&#xff0c;支持最先进的可编程桥接和IO扩展。它具有突破性的IO密度和最低的每IO成本。设备IO功能集成了对最新行业标准IO的支持。MachXO3L/LF…

工作订单生命流程

1. Field Service 中最重要的流程是工作订单流程&#xff0c;以下是工作订单流程中重要的节点&#xff0c;如图1-1 图1-1 2. 图1-2 说明了构成工作订单流程的实体、属性和关系&#xff0c;本篇文章将重点围绕此图做示例介绍 图1-2 3. 工作订单流转流程如图1-3所示 图1-3 图1…

RLOAM/RO-LOAM

LOAM框架 LOAM框架包含三个步骤&#xff1a; Scan registration&#xff1a;从原始激光扫描点数据中提取点特征。点特征是角点或者面点。 odometry estimation&#xff1a;在特征提取之后&#xff0c;特征点传递到里程计模块&#xff0c;通过特征匹配和优化步骤计算相对坐标变…

像专业人士一样调试 JavaScript:查找和修复错误的工具和技术

介绍JavaScript 是一种功能强大的编程语言&#xff0c;用于创建交互式网页和动态用户界面。然而&#xff0c;与任何编程语言一样&#xff0c;JavaScript 代码可能包含错误&#xff0c;这些错误可能会导致意外行为、错误或崩溃&#xff0c;最重要的是&#xff0c;它会使您的生活…

Apollo提前加载问题

Apollo大家应该都有在项目中用到&#xff0c;我们项目也不例外&#xff0c;携程开源的非常好用的配置化平台。今天在搭建新服务的时候发现应为Apollo的配置导致服务启动失败&#xff0c;估次排查一下具体的原因顺便记录下来&#xff0c;翻边后面再次遇到可以查阅解决&#xff0…

Golang 中 sync/atomic 包的原子操作

背景 Go中多协程的情况下&#xff0c; 要保证操作的原子性&#xff0c;一般要使用RWMutex或者Mutex&#xff0c; 但是锁使用起来比较复杂&#xff0c;还要考虑lock 和unlock 顺序和成对出现&#xff0c;不注意就容易出错。 于是在sync/atomic包中&#xff0c;把我们常用的一些…

【源码库】跟着 Vue3 学习前端模块化

Vue3为了支持不同的用户群体&#xff0c;提供了多种模块化方案&#xff0c;这样使得我们在使用的Vue的使用可以有很多种方式&#xff1b; 例如我们可以直接在html中使用script标签引入Vue&#xff0c;也可以前端工程化工具&#xff0c;例如webpack、rollup等打包工具&#xff…

2023年湖北一级技师二级技师报名时间、考试时间是什么时候?

2023年湖北一级技师二级技师报名时间、考试时间是什么时候&#xff1f; 技师是属于职业资格证书&#xff0c;是各行业的高级技术人员中设置的技术职务。技师是技能高超的技术人员、能工巧匠&#xff0c;具有丰富的实践经验&#xff0c;能在本工种难度较大的工艺加工、复杂设备、…

数据治理之数据梳理

目录 1.定义 2.用途作用 3.实施方法 3.1自上而下 3.1.1数据域梳理 3.1.2数据主题梳理 3.1.3 数据实体梳理 3.1.4设计数据模型 3.1.5优点 3.1.5缺点 3.2自下而上 3.2.1需求分析 3.2.2展现 3.2.3分析逻辑 3.2.4数据建模 3.2.5优点 3.2.6缺点 1.定义 “数据梳理”即对…

C语言例程:用二维数组实现矩阵转置

用二维数组实现矩阵转置 本实例将输入的 34 矩阵转置为 43 矩阵&#xff0c;并输出结果。通过本实例&#xff0c;可以学习如何使用二 维数组。 实例解析 二维数组的定义 二维数组定义的一般形式为&#xff1a; 第一部分 基础篇 X2277 类型说明符 数组名[常量表达式][常量表…

STM32移植FreeRTOS操作系统

一、FreeRTOS源码下载&#xff08;1&#xff09;移植钱得准备前菜对吧&#xff0c;我们先来去官网瞄一瞄网址&#xff1a;https://freertos.org/zh-cn-cmn-s/ 第一步&#xff1a;点击下载FreeRTOS第二步&#xff1a;选择版本下载&#xff08;我选择稳定版本&#xff09;注&…

git 双因子身份登录遇到的问题及解决方法

git 双因子身份登录描述&#xff1a; 一般我们登录账号和密码的时候都是通过git的账号和密码直接登录即可&#xff0c;但是如果我们用双因子身份进行登录的时候发现用账号和密码登录一直登录不了&#xff0c;&#xff0c;&#xff0c;&#xff0c;有点emo了。。 git 双因子身份…

CentOS8基础篇13:yum与dnf软件包管理器

一、YUM工具的使用 yum可以说是一个管理rpm软件包的前端工具&#xff0c;其基于rpm软件包进行管理&#xff0c;能够从指定服务器自动下载rpm软件包并进行安装&#xff0c;可以自动处理依赖关系&#xff0c;并一次安装所有需要的软件包。在RHEL本地操作系统中设置相应的软件仓库…

SAP smartforms打印图片

注意&#xff1a;SAP只能上传打印bmp格式图片 1.标准程序上传 T-CODE:SE78 2.程序代码上传 DATA: P_FILENAME TYPE RLGRAP-FILENAME,P_NAME TYPE STXBITMAPS-TDNAME,P_TITLE LIKE BAPISIGNAT-PROP_VALUE,P_DOCID TYPE STXBITMAPS-DOCID,P_RESOLUTION TYPE …

案例分析之——理由Mybatis动态SQL实现复用

无复用思想的做法&#xff1a; 在没有复用思想的时候&#xff0c;就只顾着实现功能。比如开发过程中涉及到两个表的更新功能&#xff0c;每需要更新一处&#xff0c;就写一个接口&#xff0c;结果出现了写了11个接口的情况。 这样虽然功能实现了&#xff0c;可是可能自…

express+websocket实现线上聊天

1.webSocket简介 WebSocket是一种通信协议&#xff0c;可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两…

SpringCloud之 Hystrix服务熔断

文章目录一、Hystrix 服务熔断 (已过时)&#x1f349;1.1 服务降级&#x1f349;1.2 服务熔断&#x1f349;1.3 OpenFeign 实现降级二、hystrix-dashboard 监控&#x1f34b;2.1 监控页面部署&#x1f34b;2.2 观察现象提示&#xff1a;以下是本篇文章正文内容&#xff0c;Spri…

【PySide6】信号(signal)和槽函数(slot),以及事件过滤器

说明 在PYQT中&#xff0c;父控件可以通过两种方式响应子控件的事件&#xff1a; 通过信号(signal)和槽函数(slot)机制连接子控件和父控件父控件可以通过设置eventFilter()方法来监听响应子控件的事件 一、信号(signal)和槽函数(slot) 示例 在PYQT中&#xff0c;每个组件都…