-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcpserver.py
165 lines (132 loc) · 5.02 KB
/
tcpserver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
from socket import * # 引入套接字模块
import json
install = "ZRW get install"
uninstall = "ZRW uninstall"
find = "find"
change_source = "change source"
close = "close"
def handle_command(connectionSocket, command):
'''
处理命令
:param connectionSocket: 套接字接口
:param command: 需要处理的命令
:return: 处理成功返回1 否则返回 -1
'''
command_type = command[0:len(command) - command[::-1].find(" ") - 1]
# 按照不同的指令类型进行不同测处理
if command_type == install:
apkname = command[len(command) - command[::-1].find(" ") : -1]
handle_install(connectionSocket, apkname)
return 1
elif command_type == change_source:
new_source = command[len(command) - command[::-1].find(" ") : -1]
handle_change_source(connectionSocket, new_source)
return 1
elif command_type == find:
info = command[len(command) - command[::-1].find(" ") : -1]
handle_find(connectionSocket, info)
return 1
else:
return -1
def handle_install(connectionSocket, apkname):
'''
下载命令,从软件源获得软件包并发送给客户端
:param connectionSocket: 套接字接口
:param apkname: 安装包名字
:return: 成功返回 1 否则返回 -1
'''
'''
TODO: 基于软件源或者基于开源工具
'''
pass
def handle_change_source(connectionSocket, new_source):
'''
修改软件源
:param connectionSocket: 套接字接口
:param new_source: 新的软件源
:return: 成功返回 1 否则返回-1
'''
'''
TODO: 完成修改软件源
'''
new_dict = create_dic(new_source)
json_dict = json.dumps(new_dict)
byte_dict = json_dict.encode('utf-8')
len_dict = len(byte_dict)
connectionSocket.send(str(len_dict).encode('utf-8'))
size = 0
while len_dict > 0:
if len_dict > 1024:
data = byte_dict[size*1024:(size+1)*1024]
connectionSocket.send(data)
len_dict -= 1024
size += 1
else:
data = byte_dict[size*1024:]
connectionSocket.send(data)
len_dict = 0
break
def handle_find(connectonSocket, info):
'''
搜索软件信息
:param connectonSocket: 套接字
:param info: 搜索信息
:return: 成功返回 1 否则返回 -1
'''
'''
TODO: 完成软件信息的搜索,通过套接字返回给客户端
有两类搜索,一直是基于分类,一种是基于名字
'''
pass
def create_dic(source):
'''
获取软件源里面软件的信息
:param source: 软件源
:return: 一个字典,包含软件源的软件的所有信息
'''
pass
def file_send(connectionSocket, filename, filesize):
'''
发送安装包
:param connectionSocket: 套接字接口
:param filename: 文件名
:param filesize: 文件大小
:return: 发送成功返回 1 否则返回 -1
'''
# pass
try:
size = 0
with open(filename, "rb") as file:
while size < filesize:
filedata = file.read(1024)
connectionSocket.send(filedata)
size = size + 1024
return 1
except:
return -1
command_list = [install, uninstall, find, change_source, close] # 可以处理的指令集合
serverPort = 12002 # 设置服务器端口号为12002
serverSocket = socket(AF_INET, SOCK_STREAM) # 创建欢迎套接字,第一个参数指示底层网络使用IPv4地址,第二个参数指示该套接字是SOCK_STREAM类型,这表明它是一个TCP套接字
serverSocket.bind(('', serverPort)) # 将端口号与欢迎套接字关联起来
# serverSocket.listen(1) # 等待某个客户的访问
print('The server is ready to receive\n')
while True:
serverSocket.listen(1) # 等待某个客户的访问
connectionSocket, addr = serverSocket.accept() # 当客户访问时,调用accept()方法,为这个特定客户创建一个新套接字,由客户专用
command = connectionSocket.recv(1024).decode() # 接收来自客户端的字符
print('From client: ', command) # 打印用于可视化
# 处理客户端的命令
command_type = command[0:len(command) - command[::-1].find(" ") - 1]
if (command_type not in command_list):
messig_back = "未定义的命令,请重新输入"
connectionSocket.send(messig_back.encode()) # 返回错误信息
connectionSocket.close() # 关闭这个套接字
elif command == "close" :
messig_back = "88"
connectionSocket.send(messig_back.encode())
connectionSocket.close() # 关闭这个套接字
continue
else:
messig_back = "command valid"
connectionSocket.send(messig_back.encode())
handle_command(connectionSocket, command) #命令处理函数