點(diǎn)對點(diǎn)聊天首先是基于多線程的網(wǎng)絡(luò)編程,其次就是將每一個連接都保存為一個具有獨(dú)一屬性的對象并添加到連接列表中,對于每一個連接對象發(fā)送過來的信息必須要包含主要的三項內(nèi)容(from,to,messages),這樣當(dāng)信息發(fā)送到服務(wù)器之后服務(wù)器根據(jù)to的連接對象遍歷連接列表找到目標(biāo)對象將信息發(fā)送給目標(biāo),目標(biāo)拿到信息后就知道是誰發(fā)過來的,然后根據(jù)id號碼進(jìn)行回復(fù)。此實(shí)現(xiàn)將會繼續(xù)完善,后續(xù)新加功能將會在我個人github主頁展現(xiàn)
服務(wù)器端實(shí)現(xiàn):
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
|
#coding:utf-8 ''' file:server.py date:2017/9/10 12:43 author:lockey email:lockey@123.com platform:win7.x86_64 pycharm python3 desc:p2p communication serverside ''' import socketserver,json import subprocess connLst = [] ## 連接列表,用來保存一個連接的信息(代號 地址和端口 連接對象) class Connector( object ): #連接對象類 def __init__( self ,account,password,addrPort,conObj): self .account = account self .password = password self .addrPort = addrPort self .conObj = conObj class MyServer(socketserver.BaseRequestHandler): def handle( self ): print ( "got connection from" , self .client_address) register = False while True : conn = self .request data = conn.recv( 1024 ) if not data: continue dataobj = json.loads(data.decode( 'utf-8' )) #如果連接客戶端發(fā)送過來的信息格式是一個列表且注冊標(biāo)識為False時進(jìn)行用戶注冊 if type (dataobj) = = list and not register: account = dataobj[ 0 ] password = dataobj[ 1 ] conObj = Connector(account,password, self .client_address, self .request) connLst.append(conObj) register = True continue print (connLst) #如果目標(biāo)客戶端在發(fā)送數(shù)據(jù)給目標(biāo)客服端 if len (connLst) > 1 and type (dataobj) = = dict : sendok = False for obj in connLst: if dataobj[ 'to' ] = = obj.account: obj.conObj.sendall(data) sendok = True if sendok = = False : print ( 'no target valid!' ) else : conn.sendall( 'nobody recevied!' .encode( 'utf-8' )) continue if __name__ = = '__main__' : server = socketserver.ThreadingTCPServer(( '192.168.1.4' , 8022 ),MyServer) print ( 'waiting for connection...' ) server.serve_forever() |
客戶端實(shí)現(xiàn):
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
|
#coding:utf-8 ''' file:client.py.py date:2017/9/10 11:01 author:lockey email:lockey@123.com platform:win7.x86_64 pycharm python3 desc:p2p communication clientside ''' from socket import * import threading,sys,json,re HOST = '192.168.1.4' ## PORT = 8022 BUFSIZ = 1024 ##緩沖區(qū)大小 1K ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET,SOCK_STREAM) tcpCliSock.connect(ADDR) userAccount = None def register(): myre = r "^[_a-zA-Z]\w{0,}" #正則驗(yàn)證用戶名是否合乎規(guī)范 accout = input ( 'Please input your account: ' ) if not re.findall(myre, accout): print ( 'Account illegal!' ) return None password1 = input ( 'Please input your password: ' ) password2 = input ( 'Please confirm your password: ' ) if not (password1 and password1 = = password2): print ( 'Password not illegal!' ) return None global userAccount userAccount = accout return (accout,password1) class inputdata(threading.Thread): def run( self ): while True : sendto = input ( 'to>>:' ) msg = input ( 'msg>>:' ) dataObj = { 'to' :sendto, 'msg' :msg, 'froms' :userAccount} datastr = json.dumps(dataObj) tcpCliSock.send(datastr.encode( 'utf-8' )) class getdata(threading.Thread): def run( self ): while True : data = tcpCliSock.recv(BUFSIZ) dataObj = json.loads(data.decode( 'utf-8' )) print ( '{} -> {}' . format (dataObj[ 'froms' ],dataObj[ 'msg' ])) def main(): while True : regInfo = register() if regInfo: datastr = json.dumps(regInfo) tcpCliSock.send(datastr.encode( 'utf-8' )) break myinputd = inputdata() mygetdata = getdata() myinputd.start() mygetdata.start() myinputd.join() mygetdata.join() if __name__ = = '__main__' : main() |
運(yùn)行結(jié)果示例:
服務(wù)器端結(jié)果:
客戶端1:
客戶端2:
客戶端3:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/Lockey23/article/details/77921820