python程序设计上机实践第三章答案_20192419 实验三《Python程序设计》实验报告

学号 2019-2020-2 《Python程序设计》实验3报告

课程:《Python程序设计》

班级:1924

姓名: 万腾阳

学号:20192419

实验教师:王志强

实验日期:2020年5月16日

必修/选修: 公选课

1.实验内容

创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

2. 实验过程及结果

先引入socket 库,随后还需要os,struct,sys等,由于这里使用的是base64加密,所以需要引入base64库进行加密。准备工作做完了,就开始建立连接了。建立连接时要找出没有被占有的端口,否则无法连接。同时还要找到可使用的IP地址连接完毕后就可以传输文件了。

服务器端:

先是等待请求并接受(程序会停留在这一旦收到连接请求即开启接受数据的线程),接收数据,收到请求后回复,申请相同大小的空间存放发送过来的文件名与文件大小信息,接收文件名与文件大小信息,判断是否接收到文件头信息,获取文件名和文件大小,将分批次传输的二进制流依次写入到文件,此时文件应为base64 传输结束记得断开连接避免出现错误。

客户端:

创建套接字对象 ‘s’,建立需要传输的文件路径,定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小,将文件进行base64加密,将传输文件以二进制的形式分多次上传至服务器,之后关闭套接字对象。

客户端代码:

import socket

import os

import sys

import struct

import base64

f_org = open(r'D:\qwer.txt', 'r')

content = f_org.read()

content1 = content.encode(encoding='utf-8')

content2 = base64.b64encode(content1)

f_org.close()

with open(r'D:\qwer.txt', 'wb+') as f_org:

f_org.write(content2)

print("have encrypted,the ciphertext is:"+ str(content2))

def socket_client():

try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('127.0.0.1', 9001))

except socket.error as msg:

print(msg)

sys.exit(1)

print(s.recv(1024))

filepath = r'D:\qwer.txt'

if os.path.isfile(filepath):

fileinfo_size = struct.calcsize('128sl')

fhead = struct.pack('128sl', os.path.basename(filepath).encode('utf-8'), os.stat(filepath).st_size)

s.send(fhead)

fp = open(filepath, 'rb')

while 1:

data = fp.read(1024)

if not data:

print('{0} file send over...'.format(os.path.basename(filepath)))

break

s.send(data)

s.close()

if __name__ == '__main__':

socket_client()

服务器端代码:

import sys

import os

import base64

def socket_service():

try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind(('127.0.0.1', 9001))

s.listen(10)

except socket.error as msg:

print(msg)

sys.exit(1)

print('Waiting connection...')

while 1:

conn, addr = s.accept()

t = threading.Thread(target=deal_data, args=(conn, addr))

t.start()

def deal_data(conn, addr):

print('Accept new connection from {0}'.format(addr))

conn.send('Hi, Welcome to the server!'.encode('utf-8'))

while 1:

fileinfo_size = struct.calcsize('128sl')

buf = conn.recv(fileinfo_size)

if buf:

filename, filesize = struct.unpack('128sl', buf)

fn = filename.strip(b'\00')

fn = fn.decode()

print('file new name is {0}, filesize if {1}'.format(str(fn), filesize))

recvd_size = 0

os.chdir(r"C:\Users\86186\Desktop")

fp = open('./' + str(fn), 'wb')

print('start receiving...')

while not recvd_size == filesize:

if filesize - recvd_size > 1024:

data = conn.recv(1024)

recvd_size += len(data)

else:

data = conn.recv(filesize - recvd_size)

recvd_size = filesize

fp.write(data)

url = data

str_url = base64.b64decode(url).decode("utf-8")

file = open(r'C:\Users\86186\Desktop'+'./' +str(fn) , 'w+')

file.write(str_url)

fp.close()

print('end receive...')

conn.close()

break

if __name__ == "__main__":

socket_service()

部分运行结果:

3. 实验过程中遇到的问题和解决过程

之前有一次搭建服务器时,我想试着用自己的IP地址,然后上网去找,找到后就直接运行了客户端,随后一直被服务器拒取。

后来才发现我忘记先运行服务器了。

随后的加密文件让我陷入了苦恼,python库中含有哈希值加密,但后面去查找,竟然没有用哈希值解密这样的贴子。然后我只能采取了base64加密,说是加密其实也算是一种伪加密,它只是换了一种编码方式而已,任何人通过python中的base64库进行解密。

其他(感悟、思考等)

这次实验因为还没有学习服务器的相关知识,大多数都是靠着百度完善的代码。要想熟练运用python必须多实践,多编写代码,这样运用起来就轻松很多。当然,做实验前还需要把每个细节弄清楚,弄明白,实验后,还要复习,思考,这样印象深刻,记得才牢固,否则实验后就会忘得一干二净,这还不如不做。

透过这次实验我学到了不少知识,更重要的事,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅。

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

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

相关文章

完成数独的算法 python_python实现数独算法实例

本文实例讲述了python实现数独算法的方法。分享给大家供大家参考。具体如下:# -*- coding: utf-8 -*-Created on 2012-10-5author: Administratorfrom collections import defaultdictimport itertoolsa [[ 0, 7, 0, 0, 0, 0, 0, 0, 0], #0[ 5, 0, 3, 0, 0, 6, 0, …

python读取多个文件csv_Python:读取多个文本文件并写入相应的csv文件

我在别处找不到这个问题的答案,所以我将继续把它贴在这里:我有一个Python脚本,它将读取文本文件的内容,将其内容拆分为单词,然后输出一个CSV文件,该文件将文本缩减为单词频率列表。(最后,我将插…

java treetable_在Swing中创建TreeTable | 学步园

TreeTable是Tree和Table的一个结合-就是一个即能够展开和收起行,同时也能够显示多个列的组件。在Swing的标准包里没有一个叫做JtreeTable的组件,但是我们很容易通过把Jtree做成Jtable的渲染器来创建一个这样的组件。这篇文章就是关于如何使用…

python爬去微博十大流行语_用python重新定义【2019十大网络流行语】-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...

↑关注 置顶 ~ 有趣的不像个技术号52568040f9313098ffa367d9d9d21437.jpg (5.73 KB, 下载次数: 0)2019-12-10 04:43 上传3f4d5fe0016d011a7a68af763314befd.jpg (1.06 KB, 下载次数: 0)2019-12-10 04:43 上传“文明互鉴真硬核,融梗柠檬谁觉得。霸凌第一九九六&…

java中怎么获取配置文件的值_java如何获取配置文件的值

转:原创 编码小王子 发布于2018-10-11 18:07:52 阅读数 2722 收藏展开java大型项目中都会很多系统常量,比如说数据库的账号和密码,以及各种token值等,都需要统一的管理,如果零落的散布到各个类等具体的代码中的话,在后期管理上将是一场灾难,所有需要对这些变量进行统…

python实现队列_用Python实现的数据结构与算法:队列

一、概述队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行。二、ADT队列ADT(抽象数据类型)一般提供以下接口:Queue() 创建队列enqueue(item) 向队尾插入项dequeue() 返回队首的项&#xf…

java 监听窗口是否改变_JAVA项目监听文件是否发生变化

一.spring容器都初始化完成之后做操作packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.s…

笨办法学python3 pdf 脚本之家_解决python3输入的坑——input()

如下所示:a,b,c,d input()很简单的代码,如果输入为1 -1 -2 3结果会报错,原因在于input函数会将你的输入作为python脚本运行,那么输入就变成了1-1 -2 3,即0 -2 3结果当然是错误的了,解决办法就是将输入用引…

java 数组写法_java书写、数据类型、数组定义

这里只记录java与php、javascript不同的地方,相同的地方就不赘述了。1.java文件源码为以.java为后缀的文件,字节码文件是以.class为后缀的文件。2.写好一个java源码之后,cmd进入源码文件盘符,用命令 javac helloworld.java将源码转…

python爬虫高级知识点_Python爬虫知识点梳理总结,殿堂级小白入门必读

数据分析是任何技术一样。你应该学习的目标。目标就像灯塔,指引你前进。我见过很多合作伙伴学习学习,然后学会放弃。事实上,很大一部分原因是没有明确的目标,所以你必须清楚学习的目的。你准备学习爬行之前,问问你自己为什么你想学爬行。有些人为了工作,一些为了好玩,和做一定黑…

java running_Running

/****/package test;import java.sql.ResultSet;import java.sql.SQLException;/*** author huangqin**/public class QuestString {private int curPage;//当前页数private int maxPage;//最大页数private int maxRowCount;//总记录数private int pageSize2;//每页显示的记录数…

python停用词表_多版本中文停用词词表 + 多版本英文停用词词表 + python词表合并程序...

文章简介与更新记录如果你只想获取中文停用词此表,请直接到文章结尾下载项目文件,其中包括三个中文停用词词表,一个英文停用词词表和一个合并词表的.py文件2017/07/04 创建文章,上传文件2017/07/04 更新了合并代码,添加了新的中文停用词表(哈工大扩展版本)和一个新的停用词表,现…

mysql collect_set_hive列转行 (collect_set())

一、问题hive如何将a b 1a b 2a b 3c d 4c d 5c d 6变为:a b 1,2,3c d 4,5,6二、数据test.txta b 1a b 2a b 3c d …

python编写递归函数和非递归函数、输出斐波那契数列_分别用非递归和递归的方法编写函数求斐波那契数列第n项。斐波那契数列1,1,2,3,5,8,13,…...

展开全部/**已知Fibonacci数列&#xff1a;1,1,2,3,5,8,……&#xff0c;F(1)1&#xff0c;F(2)1&#xff0c;F(n)F(n-1)F(n-2)*/#include #include typedef long long int int64;//方法1&#xff0c;递归法int64 Fibonacci(int n){int64 sum;if(n<0){printf("参数值e6…

python3.6安装ipython_centos6.5下安装python3.6、pip、ipython

一.先更换系统源为了下载顺畅一般都会更改为国内源。1 cd /etc/yum.repos.d/2 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo #下载网易源3 mv CentOS-Base.repo CentOS-Base.repo.ori #备份源4 mv CentOS6-Base-163.repo CentOS-Base.repo #把网易源更改为默认源二…

java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码

wait()/notify()方法await()/signal()方法BlockingQueue阻塞队列方法PipedInputStream/PipedOutputStream阻塞队列的一个简单实现&#xff1a;public class BlockingQueue {private List queue new LinkedList();private int limit 10;public BlockingQueue(int limit){this…

python期末大作业_大一期末考试很重要,考得好不仅有机会有钱拿,还有机会换专业...

现阶段很多高校放寒假的时间已经公布&#xff0c;这也就意味着&#xff0c;大学期末考试即将到来。对于大一新生来说&#xff0c;大学的期末考试是比较新鲜的&#xff0c;因为大家都没有经历过。经历过大学考试的学生&#xff0c;都知道大学的大概学习模式&#xff0c;一般情况…

java http 302重定向_Java 纯HTTP请求 禁止302自动重定向

Java 纯HTTP Get请求获取响应内容&#xff0c;如果发生302重定向&#xff0c;继而模拟请求域获取重定向后的响应内容。关键点&#xff1a;设置conn.setInstanceFollowRedirects为false即可示例代码public static void main(String[] args) {try {StringBuffer buffer new Stri…

python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI

1 说明&#xff1a;1.1 Pyface库由大名鼎鼎的enthought出品。1.2 介绍&#xff1a;1.2.1 英文&#xff1a;traits-capable windowing framework.The pyface project contains a toolkit-independent GUI abstraction layer, which is used to support the "visualization&…

java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解

1.1 方法重载的概述和特点方法重载概述在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参数个数或者参数类型不同即可。方法重载特点与返回值类型无关&#xff0c;只看方法名和参数列表在调用时&#xff0c;虚拟机通过参数列表的不同来区分同名方法…