20223210 2022-2023-2 《Python程序设计》实验三报告

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 原因及解决办法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值