CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
jackfrued

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: jackfrued/Python-100-Days
Path: blob/master/Day01-15/code/Day14/fileserver.py
Views: 729
1
from socket import socket, SOCK_STREAM, AF_INET
2
from base64 import b64encode
3
from json import dumps
4
from threading import Thread
5
6
7
def main():
8
9
# 自定义线程类
10
class FileTransferHandler(Thread):
11
12
def __init__(self, cclient):
13
super().__init__()
14
self.cclient = cclient
15
16
def run(self):
17
my_dict = {}
18
my_dict['filename'] = 'guido.jpg'
19
# JSON是纯文本不能携带二进制数据
20
# 所以图片的二进制数据要处理成base64编码
21
my_dict['filedata'] = data
22
# 通过dumps函数将字典处理成JSON字符串
23
json_str = dumps(my_dict)
24
# 发送JSON字符串
25
self.cclient.send(json_str.encode('utf-8'))
26
self.cclient.close()
27
28
# 1.创建套接字对象并指定使用哪种传输服务
29
server = socket()
30
# 2.绑定IP地址和端口(区分不同的服务)
31
server.bind(('192.168.1.2', 5566))
32
# 3.开启监听 - 监听客户端连接到服务器
33
server.listen(512)
34
print('服务器启动开始监听...')
35
with open('guido.jpg', 'rb') as f:
36
# 将二进制数据处理成base64再解码成字符串
37
data = b64encode(f.read()).decode('utf-8')
38
while True:
39
client, addr = server.accept()
40
# 用一个字典(键值对)来保存要发送的各种数据
41
# 待会可以将字典处理成JSON格式在网络上传递
42
FileTransferHandler(client).start()
43
44
45
if __name__ == '__main__':
46
main()
47
48