用python的socket模块实现了一个聊天室的程序 虽然功能比较简单,但是该有的基本功能还是有的
服务端
import socket import threading sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((‘localhost’, 5550)) sock.listen(5) print(‘Server’, socket.gethostbyname(‘localhost’), ‘listening …’) mydict = dict() mylist = list() # 把whatToSay传给除了exceptNum的所有人 def tellOthers(exceptNum, whatToSay): for c in mylist: if c.fileno() != exceptNum: try: c.send(whatToSay.encode()) except: pass def subThreadIn(myconnection, connNumber): nickname = myconnection.recv(1024).decode() mydict[myconnection.fileno()] = nickname mylist.append(myconnection) print(‘connection’, connNumber, ‘ has nickname :’, nickname) tellOthers(connNumber, ‘【系统提示:’ + mydict[connNumber] + ‘ 进入聊天室】’) while True: try: recvedMsg = myconnection.recv(1024).decode() if recvedMsg: print(mydict[connNumber], ‘:’, recvedMsg) tellOthers(connNumber, mydict[connNumber] + ‘ :’ + recvedMsg) except (OSError, ConnectionResetError): print(‘here’) try: mylist.remove(myconnection) except: pass print(mydict[connNumber], ‘exit, ‘, len(mylist), ‘ person left’) tellOthers(connNumber, ‘【系统提示:’ + mydict[connNumber] + ‘ 离开聊天室】’) break myconnection.close() return while True: connection, addr = sock.accept() print(‘Accept a new connection’, connection.getsockname(), connection.fileno()) try: # connection.settimeout(5) buf = connection.recv(1024).decode() if buf == ‘1’: connection.send(b’welcome to server!’) # 为当前连接开辟一个新的线程 mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno())) mythread.setDaemon(True) mythread.start() else: connection.send(b’please go out!’) connection.close() except: pass
客户端程序
import socket import time import threading sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #sock.connect((‘localhost’,5550)) sock.connect((‘119.29.152.242′, 5550)) sock.send(b’1’) print(sock.recv(1024).decode()) nickName = input(‘input your nickname: ‘) sock.send(nickName.encode()) def sendThreadFunc(): while True: try: myword = input() sock.send(myword.encode()) # print(sock.recv(1024).decode()) except ConnectionAbortedError: print(‘Server closed this connection!’) except ConnectionResetError: print(‘Server is closed!’) def recvThreadFunc(): while True: try: otherword = sock.recv(1024) if otherword: print(otherword.decode()) else: pass except ConnectionAbortedError: print(‘Server closed this connection!’) except ConnectionResetError: print(‘Server is closed!’) th1 = threading.Thread(target=sendThreadFunc) th2 = threading.Thread(target=recvThreadFunc) threads = [th1, th2] for t in threads: t.setDaemon(True) t.start() t.join()
参考链接:Python socket聊天室程序
源代码:聊天室
效果如下