实验三
20193211 2019-2020-2 《Python程序设计》实验3报告
课程:《Python程序设计》
班级:1932
姓名:冷聃
学号:20193211
实验教师:王志强
实验日期:2020年5月30日
必修/选修: 公选课
一.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
二.实验要求
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
三.实验过程及结果
(1)Socket编程工作原理:
服务器端:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
客户端:客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
(2)编程模板:
TCP服务端:
创建套接字,绑定套接字到本地IP与端口#socket.socket(socket.AF_INET,socket.SOCK_STREAM),s.bind()
开始监听连接#s.listen()
进入循环,不断接受客户端的连接请求#s.accept()
然后接收传来的数据,并发送给对方数据#s.recv(),s.sendall()
传输完毕后,关闭套接字#s.close()
TCP客户端:
创建套接字,连接远端地址#socket.socket(socket.AF_INET,socket.SOCK_STREAM),s.connect()
连接后发送数据和接收数据#s.sendall(),s.recv()
传输完毕后,关闭套接字#s.close()
注意:TCP和UDP
TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。
服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)
(3)代码:
服务器:
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8010))
s.listen()
conn, address = s.accept()
data = conn.recv(1024)
f = open("receive.txt", "w")
data1 = base64.b32decode(data)
f.write(data1.decode())
f.close()
print("收到来自客户端的密文:", data.decode(), "\n已解密至receive文件中")
conn.sendall("密文已接收!".encode())
data1 = conn.recv(1024)
print("来自客户端的信息", data1.decode())
s.close()
客户端
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8010))
text = input("请输入要消息:")
file = open('send.txt', 'a+')
file.write(text)
print('内容已保存')
text = text.encode('utf-8')
encode_text = base64.b32encode(text)
s.sendall(encode_text)
file.close()
data = s.recv(1024)
print("客户端的信息:", data.decode())
s.sendall("收到".encode())
print("内容已加密传输")
s.sendall("客户端已接收!".encode())
s.close()
(4)操作:
1. 关闭防火墙
2. 运行服务器端,然后运行客户端
(5)结果:
客户端:
服务器:
四.实验过程中遇到的问题和解决过程
- 问题1:import变成灰色
- 问题1解决方案:“Suppress for statement”
五.其他(感悟、思考等)
实验代码修修改改才写好。学习编程需要投入时间练习,动手才能发现问题。
## 参考资料
- [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
- [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)