-
Notifications
You must be signed in to change notification settings - Fork 5
/
client.py
172 lines (145 loc) · 5.78 KB
/
client.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
166
167
168
169
170
171
172
# -*- coding: UTF-8 -*-
import socket
import struct
import os
import thread
import random
class RequsetType:
userReg = '00'
userLogin = '01'
userLogout = '02'
shareFile = '10'
searchFile = '11'
class AnswerType:
success = '00'
failed = '01'
class Client:
ServerIP = ''
ServerPort = 0
LocalIP = ''
LocalPort = 0
LocalListenPort = 0
sock = None
sockListen = None
getFileSock = None
sendDir = u'E:\\p2p\\send\\'
downloadDir = u'E:\\p2p\\down\\'
def __init__(self):
thread.start_new_thread(self.__listenForOtherClient,())
self.LocalIP = socket.gethostbyname(socket.gethostname())
pass
def __listenForOtherClient(self):
''' 监听等待其他Client的连接请求 '''
self.sockListen = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.LocalListenPort = random.randint(7000, 7999)
self.sockListen.bind((self.LocalIP, self.LocalListenPort))
self.sockListen.listen(10)
while True:
connection,address = self.sockListen.accept()
# 这里接收到文件名
fileName = connection.recv(25)
# 发送文件
# 对文件分块,一次4K
fp = open(self.sendDir + fileName,'rb')
while 1:
filedata = fp.read(1024 * 4)
if not filedata:
break
connection.send(filedata)
connection.close()
#thread.exit_thread()
def __connectServer(self,ServerIP,ServerPort = 8000):
''' 连接服务器,每次请求就需要连接一次 '''
self.ServerIP = ServerIP
self.ServerPort = ServerPort
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.ServerIP, self.ServerPort))
self.LocalPort = self.sock.getsockname()[1]
def __Request(self,reqType,reqContext):
localIP = socket.gethostbyname(socket.gethostname())
self.__connectServer(localIP)
self.sock.send(reqType)
self.sock.send(reqContext)
ansType = self.sock.recv(2)
asnContext = self.sock.recv(1024)
return ansType,asnContext
def userReg(self,Name,Passwd):
''' 用户注册 '''
reqContext = struct.pack('!25s25s',str(Name),str(Passwd))
ansType,asnContext = self.__Request(RequsetType.userReg,reqContext)
if ansType != AnswerType.success:
print 'userReg failed: %s' % asnContext
return False
else:
print 'userReg success!'
return True
def userLogin(self,Name,Passwd):
''' 用户登录,返回值为用户ID '''
reqContext = struct.pack('!25s25s25sI',str(Name),str(Passwd),self.LocalIP,self.LocalListenPort)
ansType,ansContext = self.__Request(RequsetType.userLogin,reqContext)
if ansType != AnswerType.success:
print 'userLogin failed: %s' % ansContext
return False
else:
ID, = struct.unpack('!I',ansContext)
print 'userLogin success: ID = %s' % ID
return ID
def userLogout(self,UserID):
''' 用户注销 '''
reqContext = struct.pack('!I',UserID)
ansType,asnContext = self.__Request(RequsetType.userLogout,reqContext)
if ansType != AnswerType.success:
print 'userLogout failed: %s' % asnContext
else:
print 'userLogout success!'
def shareFile(self,Name,UploadUserID):
''' 分享文件 '''
statinfo = os.stat(self.sendDir + Name)
reqContext = struct.pack('!25s2I',str(Name),statinfo.st_size,UploadUserID)
ansType,asnContext = self.__Request(RequsetType.shareFile,reqContext)
if ansType != AnswerType.success:
print 'shareFile failed: %s' % asnContext
else:
print 'shareFile success!'
def searchFile(self,Name):
''' 查找文件 '''
reqContext = struct.pack('!25s',str(Name))
ansType,asnContext = self.__Request(RequsetType.searchFile,reqContext)
if ansType != AnswerType.success:
print 'searchFile failed: %s' % asnContext
return '',0,0,'',0,'',0
else:
Name,Size,UploadUserID,UploadUserName,OnLine,IP,ListenPort = struct.unpack('!25s2I25sI25sI',asnContext)
Name = Name.rstrip('\0')
IP = IP.rstrip('\0')
#self.__getFile(Name,Size,DisIP,DisPort)
#print 'getFile success! %s' %Name
return Name,Size,UploadUserID,UploadUserName,OnLine,IP,ListenPort
def getFile(self,fileName,fileSize,DisIP,DisPort):
self.getFileSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.getFileSock.connect((DisIP, DisPort))
# 发送文件名
self.getFileSock.send(fileName)
restsize = fileSize
# 接受文件
# 对文件分块,一次4K
fp = open(self.downloadDir + fileName,'wb')
while 1:
if restsize > 1024 * 4:
filedata = self.getFileSock.recv(1024 * 4)
else:
filedata = self.getFileSock.recv(restsize)
fp.write(filedata)
restsize = restsize-len(filedata)
if restsize == 0:
break
if __name__ == '__main__':
client = Client()
#client.listenForOtherClient()
#client.Request('ddddd')
#client.userReg('dc','123')
ID = client.userLogin('dc','123')
#client.shareFile('osrloaderv30.zip',ID)
#os.system("pause")
#client.getFile('osrloaderv30.zip')
#client.userLogout('dc','123')