计算机网络-基础编程实验(JAVA\Python3)

news2024/11/26 16:40:04

计算机网络-网络基础编程实验(JAVA\Python3)

一.实验目的

        通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。

二.实验内容

学习套接字编程,完成以下的网络数据收发程序。

1.采用TCP进行数据发送的简单程序

2.采用UDP进行数据发送的简单程序

3.多线程/线程池对比

4.简单的chat程序,并能实现互传文件

三.实验过程

        使用python语言进行网络数据收发程序的实现。在本机建立客户端和服务器程序,服务器IP使用127.0.0.1。

1.采用TCP进行数据发送的简单程序

客户端:

     声明服务器名和端口,通过套接字建立TCP连接。连接建立后向服务器发送一个字符串,等待接收服务器的字节,接收到回车符结束后,关闭客户的套接字,客户和服务器之间的TCP连接也会关闭。

 服务器端:

     服务器同样需要创建套接字,并将这个创建的套接字和端口绑定,该套接字将监听来自客户的TCP连接请求。当客户发起连接请求后,服务器会创建一个新的套接字,由客户专用。使用新的套接字,服务器就可以和客户通过TCP连接进行通信了。

         运行服务器程序和客户端程序,可以进行通信:

2.采用UDP进行数据发送的简单程序

客户端:

        基本与TCP相同,区别是不需要建立连接,发送数据时需要指明服务器名和端口。

 服务器:

        与TCP相比,不需要欢迎套接字,也不需要监听客户端的连接请求,直接对接收到的数据进行处理,并通过套接字向客户端发送数据。

3.多线程/线程池对比

(1)多线程/线程池的对比

        当有多个客户端向服务器发起请求时,服务器只能逐个处理客户端的请求,在处理某个客户端的请求时,不会对其他客户的请求作出响应。采用并行服务器的方式,每个连接单独处理,不产生干扰,实现并行服务的方式有两种,一种是为每个客户创建一个线程,另一种是使用线程池。

        为每个客户都创建一个新的线程,每个新线程都要消耗系统资源。当客户较多时,线程数逐渐增加,消耗的资源也越来越多。且系统需要对线程进行管理,并处理线程之间的上下文切换。在客户较多的情况下,使用多线程处理客户的请求可能实际上增加了客户端总服务时间。

        为了解决线程过多的问题,可以对总线程数进行限制,并重复使用线程。在服务器启动时创建一个由固定数量线程池组成的线程池,当收到一个客户端的连接请求,就将处理请求的任务交给线程池中的一个线程处理,处理结束后该线程将返回线程池。如果连接请求到达服务器时没有可用线程,请求将在队列中等待空闲的线程。

        以下用Python语言实现多线程和使用线程池的服务器。尝试服务器程序实现多线程/线程池,需要先了解Python中的多线程及线程池。

(2)Python中的多线程

        Python中的threading模块用于支持多线程的操作。使用该模块可以创建线程,并查看已有线程的状态。线程可分为守护线程和非守护线程。

        守护线程:守护线程和主线程一起运行,主线程销毁,守护线程会和主线程一起销毁。

        非守护线程:主线程销毁,非守护线程继续运行,不受影响。

        创建线程时可以设定线程为守护线程。线程运行后,threading模块提供了一些方法支持多线程。如线程阻塞方法,用于实现同步与互斥的锁,条件变量,信号变量等。

(3)线程池

        Python中concurrent.futures库中的ThreadPoolExecutor类可以实现线程池。

  • ThreadPoolExecutor构造实例时,通过传入max_workers参数来设置线程池中最多能同时运行的线程数。
  • 通过submit()方法提交线程需要执行的任务到线程池,返回该任务的句柄。
  • done()方法可以判断任务是否结束,cancel()方法可以取消提交的任务,在线程池中已经运行的任务不可以取消。result()方法可以获取任务的返回值,这个方法是阻塞的。

(5)采用多线程的服务器程序

        采用为每一个客户创建一个单独的线程服务,通过以上提到过的threading模块实现,具体实现如下:

        使用多线程的客户端发起连接请求,运行程序:

 (6)采用线程池的服务器程序

        使用上述ThreadPoolExecutor创建一个可最多运行5个线程的线程池来对客户进行服务,具体实现如下:

       运行程序,前三个请求是线程池中的三个线程同时处理完成的,三个请求处理完毕后,其中的两个线程又处理后两个请求。

 4.可实现互传文件的简单chat程序

        进行对话和互传文件的处理有所不同,因此先进行约定,客户端如果要发送或上传文件,输入的指令格式应该为[download/upload 文件路径],客户端确认消息类型为请求上传或下载文件,发送请求[download|文件路径]或[upload|文件名|文件大小],服务器收到消息后得知需要上传或下载文件,进行相应的回应(下载文件时回应[文件名|文件大小],上传时回应准备好上传),当双方都做好准备后,开始进行发送。

        进行上传文件时,首先需要确认客户端给出的文件是否存在。如果文件存在,读取文件名和文件大小,并按照[upload|文件名|文件大小]的格式向服务器发送upload请求,服务器接收到请求后,拼接好文件的接收路径,创建文件,然后向客户端发送准备好接收文件的消息。客户端收到消息后,就可以开始读取文件,每次读取2048字节,并向服务器发送,服务器接收到后就将数据写入文件,直到文件大小的数据全部接收到。

客户端的部分代码如下:

 服务器接收文件的代码如下:

         下载文件的过程与接收文件类似,区别在于客户端需要先把文件名发送给服务器,服务器确认文件是否存在,如果文件存在,再进行类似上述上传文件的过程。

客户端下载文件的代码如下:

 服务器传输文件的代码如下:

         服务器程序采用(3)中编写的线程池服务器,运行程序,将client的文件a.txt上传到服务器,将服务器的b.docx文件下载到client的文件夹中。

客户端:

 服务器:

         传输结束后,可以在客户和服务器的文件夹client和server中找到下载/上传的文件。程序实现了文件互传的功能。

四.实验总结

        通过本实验,学习了采用Socket(套接字)设计简单的网络数据收发程序,并编写了UDP数据发送程序和TCP数据发送程序,熟悉了使用Socket编程的基本方法。了解了服务器的多线程实现和线程池实现方式,并进行简单的实现。通过编写能传输文件的客户-服务器程序,加深了对于客户-服务器文件传输过程的理解。 

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

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

相关文章

海尔牵头IEEE P2786国际标准通过Sponsor投票并连任工作组主席

01 海尔牵头IEEE P2786国际标准 通过Sponsor投票 并连任工作组主席 海尔牵头制定的全球首个服装物联网国际标准IEEE P2786《Standard for General Requirements and Interoperability for Internet of Clothing》通过Sponsor投票,标志着该国际标准草案得到了行业…

ThingsBoard教程(三六):规则节点解析 检查关系节点 check relation,实体类型节点 entity type

前言 本篇文章和大家一起来学习两个节点,检查关系节点 check relation和实体类型节点 entity type。 check relation 检查消息的发起者与其他实体之间是否存在关系。如果选择了“check relation to specific entity(检查与特定实体的关系)”,则必须指定相关实体。否则,…

程序员的4个真相(看了有点想乱搞)

最近在知乎看到一个很有意思的问题,热度还挺高的。 “程序员的通病是什么?” 很多人第一印象就是: - 加班 - 脱发 - 单身直男 - 亚历山大 - 需求魔幻 其实这些标签在其他行业领域也普遍存在,也并不是程序员真正的悲哀。 真正的…

3 程序流程控制-函数、包、常用函数【Go语言教程】

3 程序流程控制-函数、包【Go语言教程】 一、 程序流程控制 顺序控制分支控制switch分支for循环 Go 语言没有 while 和 do…while 语法,这一点需要同学们注意一下,如果我们需要使用类似其它语言(比如 java / c 的 while 和 do…while ),可以…

CVE-2023-28432 MiniO信息泄露漏洞复现

CVE-2023-28432 MiniO信息泄露漏洞 MiniO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等 在集群部署的 Minio…

计算机网络学习05(HTTP vs HTTPS)

1、HTTP 协议介绍 HTTP 协议,全称超文本传输协议(Hypertext Transfer Protocol)。顾名思义,HTTP 协议就是用来规范超文本的传输,超文本,也就是网络上的包括文本在内的各式各样的消息,具体来说&…

【干货分享】一文说透分布式一致性协议(上)

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:大熊老师 | 慕课网讲师 在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟…

ChatGPT实现多语种翻译

语言翻译 多语种翻译是 NLP 领域的经典话题,也是过去很多 AI 研究的热门领域。一般来说,我们认为主流语种的互译一定程度上属于传统 AI 已经能较好完成的任务。比如谷歌翻译所采用的的神经机器翻译(NMT, Neural Machine Translation)技术就一度让世人惊…

【JavaEE进阶】——第四节.Spring更简单的实现Bean对象的存取(利用注解储存和注入Bean对象)

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:JavaEE进阶 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录 前…

Linux安装flutter

在Linux上安装flutter 1.使用快照安装flutter 安装snapd sudo apt update sudo apt install snapd安装flutter sudo snap install flutter --classic显示flutter sdk-path flutter sdk-path2.手动安装flutter 在flutter官网上查看安装流程 https://docs.flutter.dev/get…

现代微服务中缓存的分类及缓存一致性设计原则

引言 大部分面向公众的互联网系统,其并发请求数量与在线用户数量都是正相关的,而 MySQL能够承担的并发读写量是有一定上限的,当系统的访问量超过一定程度的时候,纯MySQL就很难应付了。 绝大多数互联网系统都是采用MySQLRedis这对…

MongoDB【索引-index】

目录 1:概述 2:索引的类型 2.1:单字段索引 2.2:复合索引 2.3:其他索引 3:索引的管理操作 3.1:索引的查看 3.2:索引的创建 3.3:索引的移除 4:索引的…

【福利赠书】有人说,测试驱动开发已死?(文末赠书3本)

友情推荐一本测试领域的教科书:(文末送3本) 《 测试驱动开发:入门、实战与进阶》,英文原书名为《Learning Test-Driven Development 》,是一本实用且有趣的TDD实践教程。如果你想开始做测试驱动开发&#x…

【WPF动画】简单构造一个相册轮播图淡化切换特效

效果图 简单的定时器结合DoubleAnimation使用示例&#xff0c;实现轮播图淡化切入特效 代码部分 <Image x:Name"carouselImage" Margin"10" HorizontalAlignment"Center" VerticalAlignment"Center" Stretch"UniformToFill&…

倾斜摄影超大场景的三维模型的顶层合并的纹理压缩与抽稀处理技术分析

倾斜摄影超大场景的三维模型的顶层合并的纹理压缩与抽稀处理技术分析 倾斜摄影超大场景的三维模型的顶层合并需要对纹理进行压缩和抽稀处理&#xff0c;以减小数据量和提高数据的传输和展示性能。以下是一种常用的纹理压缩和抽稀处理技术&#xff1a; 1、纹理图集 纹理瓦片化…

网络安全漏洞分析之远程代码执行

介绍 Apache Flume 是一个分布式的&#xff0c;可靠的&#xff0c;并且可用于高效地收集&#xff0c;汇总和移动大量日志数据的软件。它具有基于流数据流的简单而灵活的体系结构。它具有可调的可靠性机制以及许多故障转移和恢复机制&#xff0c;并且具有健壮性和容错性。它使用…

国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作

IAP升级 Bootloader的制作 1、上节提到Flash的分区&#xff0c;0x8000000-0x8004000为Boot分区&#xff0c;我们的bootloader就烧录到此分区。 Bootloader很简单&#xff0c;新建一个普通的工程&#xff0c; 也不用初始化外部设备&#xff0c;开机后&#xff0c;直接跳转到 A…

【方法】 如何批量将RAR或其他压缩格式转换成ZIP?

压缩文件的格式有很多种&#xff0c;比如RAR、ZIP、7-Zip、CAB、ARJ、ACE、TAR、BZ2等等。因为需求不同&#xff0c;或者不同平台对上传的压缩包格式要求不同&#xff0c;我们往往需要把压缩文件进行格式转换&#xff0c;那压缩文件不同格式之间如何进行转换呢&#xff1f; 如…

AlgoC++第八课:手写BP

目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…

15-721 Chapter10 恢复协议

BackGround 为了在可能crash的情况下&#xff0c;确保事务和数据库状态的&#xff0c;一致性&#xff0c;原子性&#xff0c;持久性。恢复算法大体可以分为两个方面&#xff1a;1.在事务过程中要做哪些处理 2.崩溃后要做哪些处理。 与disk数据库的差异 1.恢复不需要跟踪dir…