zoukankan      html  css  js  c++  java
  • 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 :

    系统监视:

     
  • 相关阅读:
    12.12
    12.11
    1208
    1206
    2018-12-23丛晓强作业
    2018-12-17面向对象总结
    2018-12-17-丛晓强作业
    2018-12-13丛晓强作业
    2018-12-12丛晓强作业
    2018-12-11丛晓强作业
  • 原文地址:https://www.cnblogs.com/zknublx/p/8460967.html
Copyright © 2011-2022 走看看