20223210 2022-2023-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2232
姓名: 黄湛
学号:20223210
实验教师:王志强
实验日期:2023年4月13日
必修/选修: 公选课
(一)实验内容和要求
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
(二)实验过程及结果
本机ip地址
关闭防火墙
服务端 server
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.0.111',8001))
#创建套接字,绑定套接字到本地ip与端口
s.listen()
#监听连接
conn, address = s.accept()
#进入循环,不断接受客户端的连接请求
data = conn.recv(1024)
file = open("receive.txt","w")
data1 = base64.b32decode(data)
file.write(data1.decode())
file.close()
print("Receive encoded information from client: ",data.decode());
print("Already decrypt in the file.")
conn.sendall("Received already.".encode())
#发送数据
data1 = conn.recv(1024)
#接收数据
print("the information from client:",data1.decode())
s.close()
#传输完毕,关闭套接字
客户端client
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.111',8001))
text = input("Please enter the content you want to transmit:")
file = open('send.txt','a+')
file.write(text)
print("the contents are written to the file.")
text = text.encode('utf-8')
encodetext = base64.b32decode(text)
s.sendall(encodetext)
file.close()
data = s.recv(1024)
print("the information from client:",data.decode())
s.sendall("Received already.")
print("The file content has been encrypted and sent.")
s.sendall("Received already.")
s.close()
文件
上传
(三)问题和解决方案
问题:由于目标计算机积极拒绝,无法连接
解决方案:关闭防火墙
感悟与思考
有关socket编程的相关应用还是蛮懵懵的 加油加油
附:实验二中有关带界面的计算器
(写于 2023.3.31 开心)
(1)代码
from tkinter import *
import tkinter as tk
cal = Tk()
cal.title("calculator plus")
cal.geometry("340x455") #窗口大小 字母x
from functools import partial
from math import sin,cos,tan,asin,acos,atan,pi,e,log,sqrt,degrees
result = 0 #用来储存上一次的计算结果
flag = 0 #用来判断 上一次是 得出结果 or 不合法计算 or 算式输入中
btn = ("sin","cos","tan","asin","acos","atan",
"max","min","(",")","AC","<-",
"sqrt",7,8,9,"**","*",
"abs",4,5,6,"log","-",
"pi",1,2,3,"/","+",
"e",",",0,".","%","=")
con = ("**","*","-","+","/",".","%")
def add(x):
global flag
if flag == 1: #上一个是得出结果
flag = 0
if x in con:
var.set(str(result) + str(x))
else:
var.set(str(x))
elif flag == -1: #上一次是不合法计算
flag = 0
var.set(str(x))
else: #上一次算式正在输入中
var.set(var.get() + str(x))
def clear():
global flag
flag = 0
var.set("")
def delete():
var.set(var.get()[ : -1])
def work(): #计算
global result, flag
try:
result = eval(var.get())
flag = 1
var.set(var.get() + "=" + str(result))
except:
var.set("Invalid Input")
flag = -1
var = tk.StringVar()
entry = tk.Entry(cal, textvariable = var, relief = "sunken", width = 40, bg = "white")
entry.grid(row = 1, columnspan = 30, pady =8 , ipady = 20)
for i in range(len(btn)):
if btn[i] == "AC":
b = tk.Button(cal, text=btn[i], font=(20), width=4, height=2, command=partial(clear))
elif btn[i] == "<-":
b = tk.Button(cal, text=btn[i], font=(20), width=4, height=2, command=partial(delete))
elif btn[i] == "=":
b = tk.Button(cal, text=btn[i], font=(20), width=4, height=2, command=partial(work))
else:
b = tk.Button(cal, text=btn[i], font=(20), width=4, height=2, command=partial(add, btn[i]))
b.grid(row = 10 + i // 6, column = i % 6, padx = 3, pady = 3)
cal.mainloop()
(2)运行结果展示
计算 (可连续: 保留上一个算式的结果)
(3)代码上传到gitee
问题与解决方案
问题1:
问题1解决方案:
问题2:
eval()函数中的算式可能不合法
问题2解决方案:
运用try…except…语句
问题3:
函数内部修改全局变量
问题3解决方案:
添加global
参考资料
使用lambda和partial向槽函数传递参数的区别
【python教程】之try–except异常捕获
local variable referenced before assignment 原因及解决办法