Python socket聊天室程序

http://blog.csdn.net/calling_wisdom/article/details/42524745

 今天用python的socket模块实现了一个聊天室的程序

虽然功能比较简单,但是该有的基本功能还是有的

还望大家指点

服务器端程序:

复制代码
  1. import socket  
  2. import threading  
  3.   
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  5.   
  6. sock.bind(('localhost', 5550))  
  7.   
  8. sock.listen(5)  
  9. print('Server', socket.gethostbyname('localhost'), 'listening ...')  
  10.   
  11. mydict = dict()  
  12. mylist = list()  
  13.   
  14. #把whatToSay传给除了exceptNum的所有人  
  15. def tellOthers(exceptNum, whatToSay):  
  16.     for c in mylist:  
  17.         if c.fileno() != exceptNum :  
  18.             try:  
  19.                 c.send(whatToSay.encode())  
  20.             except:  
  21.                 pass  
  22.   
  23. def subThreadIn(myconnection, connNumber):  
  24.     nickname = myconnection.recv(1024).decode()  
  25.     mydict[myconnection.fileno()] = nickname  
  26.     mylist.append(myconnection)  
  27.     print('connection', connNumber, ' has nickname :', nickname)  
  28.     tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 进入聊天室】')  
  29.     while True:  
  30.         try:  
  31.             recvedMsg = myconnection.recv(1024).decode()  
  32.             if recvedMsg:  
  33.                 print(mydict[connNumber], ':', recvedMsg)  
  34.                 tellOthers(connNumber, mydict[connNumber]+' :'+recvedMsg)  
  35.   
  36.         except (OSError, ConnectionResetError):  
  37.             try:  
  38.                 mylist.remove(myconnection)  
  39.             except:  
  40.                 pass  
  41.             print(mydict[connNumber], 'exit, ', len(mylist), ' person left')  
  42.             tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 离开聊天室】')  
  43.             myconnection.close()  
  44.             return  
  45.   
  46. while True:  
  47.     connection, addr = sock.accept()  
  48.     print('Accept a new connection', connection.getsockname(), connection.fileno())  
  49.     try:  
  50.         #connection.settimeout(5)  
  51.         buf = connection.recv(1024).decode()  
  52.         if buf == '1':  
  53.             connection.send(b'welcome to server!')  
  54.   
  55.             #为当前连接开辟一个新的线程  
  56.             mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno()))  
  57.             mythread.setDaemon(True)  
  58.             mythread.start()  
  59.               
  60.         else:  
  61.             connection.send(b'please go out!')  
  62.             connection.close()  
  63.     except :    
  64.         pass  
复制代码

客户端程序:

复制代码
  1. import socket  
  2. import time  
  3. import threading  
  4.   
  5. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  6.   
  7. sock.connect(('localhost', 5550))  
  8. sock.send(b'1')  
  9. print(sock.recv(1024).decode())  
  10. nickName = raw_input('input your nickname: ')  
  11. sock.send(nickName.encode())  
  12.   
  13. def sendThreadFunc():  
  14.     while True:  
  15.         try:  
  16.             myword = raw_input()  
  17.             sock.send(myword.encode())  
  18.             #print(sock.recv(1024).decode())  
  19.         except ConnectionAbortedError:  
  20.             print('Server closed this connection!')  
  21.         except ConnectionResetError:  
  22.             print('Server is closed!')  
  23.       
  24. def recvThreadFunc():  
  25.     while True:  
  26.         try:  
  27.             otherword = sock.recv(1024)  
  28.             if otherword:  
  29.                 print(otherword.decode())  
  30.             else:  
  31.                 pass  
  32.         except ConnectionAbortedError:  
  33.             print('Server closed this connection!')  
  34.   
  35.         except ConnectionResetError:  
  36.             print('Server is closed!')  
  37.   
  38.   
  39. th1 = threading.Thread(target=sendThreadFunc)  
  40. th2 = threading.Thread(target=recvThreadFunc)  
  41. threads = [th1, th2]  
  42.   
  43. for t in threads :  
  44.     t.setDaemon(True)  
  45.     t.start()  
  46. t.join()  
复制代码

代码执行效果图:

聊天过程1:

系统监视:

聊天过程 2 :

系统监视:

 
原文地址:https://www.cnblogs.com/zknublx/p/8460967.html