20191318实验三 Socket编程技术

20191318 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 1913
姓名: 王泽文
学号:20191318
实验教师:王志强
实验日期:2020年4月11日
必修/选修: 公选课

1. 实验内容

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

2. 实验过程及结果

  1. 使用socket模块进行编写客户端和服务端,并使用base64对文件进行加密

服务端代码如下

import socket
import base64


def base64_decode(name, ciphertext):
   ciphertext = ciphertext.encode('utf-8')
   ciphertext = base64.b64decode(ciphertext)
   result = ciphertext.decode('utf-8')
   f0 = open(name, "w+")
   f0.write(result)
   f0.close()
   return result


print("正在等待连接。。。。")
while True:
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.bind(('192.168.137.1', 800))
   s.listen()
   conn, address = s.accept()
   txet = conn.recv(1024)
   print(txet.decode('utf-8'))
   data0 = conn.recv(1024)
   if data0.decode('utf-8') == "对方已退出":
       print(data0.decode('utf-8'))
       s.close()
   elif data0.decode('utf-8') == "正在发送文件":
       print("正在接收文件。。。。")
       name = conn.recv(1024)
       data = conn.recv(1024)
       base64_decode(name.decode('utf-8'), data.decode('utf-8'))
       print("已接收:"+name.decode('utf-8'))
       conn.sendall("发送成功".encode('utf-8'))
   else:
       print("客户端:"+data0.decode('utf-8'))
       conn.sendall(("服务端已接收:" + str(data0.decode('utf-8'))).encode('utf-8'))

客户端代码如下

import socket
import base64


def base64_encode(ad, name):
   f0 = open(ad + name, "r+")
   str = f0.read()
   pp = str.encode('utf-8')
   pp = base64.b64encode(pp)
   pp = pp.decode('utf-8')
   return pp


while True:
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.connect(('192.168.137.1', 800))
   s.sendall("连接成功".encode('utf-8'))
   a = int(input("1.通信 2.传输文件 3.退出\n请输入:"))
   if a == 1:
       str = input("输入:")
       s.sendall(str.encode('utf-8'))
       data = s.recv(1024)
       print(data.decode('utf-8'))
   elif a == 2:
       s.sendall("正在发送文件".encode('utf-8'))
       ad = input("请输入文件地址:")
       name = input("请输入文件名:")
       s.sendall(name.encode('utf-8'))
       str = base64_encode(ad, name)
       s.sendall(str.encode('utf-8'))
       data = s.recv(1024)
       print(data.decode('utf-8'))

   else:
       str = "对方已退出"
       s.sendall(str.encode('utf-8'))
       print("已退出")
       s.close()
       break

运行效果如图
基本功能效果
客户端
基本功能效果
服务端
基本功能效果
代码链接https://gitee.com/python_programming/wzw20191318/commit/608c38547522b6349c78efde93dece5195aef673

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

  1. 在socket接收时只能接收一次数据

解决方法:每一次sendall都需要一次recv来接收

4. 思考和感悟

  • socket模块有很多有意思的东西,我还需要更深入的去学习。

参考资料

posted @ 2020-05-23 21:18  20191318王泽文  阅读(215)  评论(0编辑  收藏  举报