Point -to -point chat is first based on multi -threaded network programming, and secondly, save each connection as an object with unique attributes and add it to the connection list. Three items (from, to, messages), so that when the information is sent to the server, the server traverses the target object to send the information to the target according to the connection list of the to -to -the -connected object. Reply according to the ID number. Essence This implementation will continue to be improved, and the new new features will be in my personal persongithub homepageShow
server terminal implementation:
#coding:utf-8
'''
file:server.py
date:2017/9/10 12:43
author:lockey
email:[email protected]
platform:win7.x86_64 pycharm python3
desc:p2p communication serverside
'''
import socketserver,json
import subprocess
connLst = []
## Connection list to save a connected information (code address and port connection object)
class Connector(object):# connection object class
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'))
# If the information format sent by the client is a list and the registration logo is registered when the registration logo is false
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)
# If the target client sends data to the target customer service side
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()
Client implementation:
#coding:utf-8
'''
file:client.py.py
date:2017/9/10 11:01
author:lockey
email:[email protected]
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 ## buffer size 1K
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
userAccount = None
def register():
myre = r"^[_a-zA-Z]\w{0,}"
# 12 12 12 12 whether the user name is in line with the specification
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()
Run results example:
server side results:
Client 1:
Client 2:
Client 3: