socket聊天室

  1 #服務端
  2 from socket import *
  3 import json
  4 def recvMsg(s):
  5     while True:
  6         #接收用戶的信息
  7         data,address = s.recvfrom(1024)
  8         data = json.loads(data)
  9         print(data,address)
 10 
 11         if data['type'] == 'enter':
 12             # 將用戶進入聊天室的信息發給其它全部在線用戶
 13             sendToAll(('>>系統:%s進入了聊天室'%data['content']).encode('utf-8'),s,address)
 14             #將用戶信息加入users字典
 15             if address not in users:users[address]=data['content']
 16         elif data['type'] == 'quit':
 17             # 將用戶離開聊天室的信息發給其它全部在線用戶
 18             sendToAll(('>>系統:%s離開了聊天室' % data['content']).encode('utf-8'), s, address)
 19             # 將退出的用戶從users中刪除
 20             users.pop(address)
 21 
 22         elif data['type'] == 'msg':
 23             sendToAll(('>>%s:%s'%(users[address],data['content'])).encode('utf-8'),s,address)
 24 
 25         else:
 26             for i in users:
 27                 if users[i] == data['name']:
 28                     s.sendto(('>>%s私信你說:%s'%(users[address],data['content'])).encode('utf-8'),i)
 29 
 30 def sendToAll(msg,s,address):
 31     for addr in users:
 32         if addr != address:
 33             s.sendto(msg,addr)
 34 
 35 
 36 def main():
 37     #建立socket
 38     s = socket(AF_INET,SOCK_DGRAM)
 39     #綁定服務器ip和端口
 40     s.bind(('172.16.11.199',8888))
 41     #接收用戶的信息
 42     recvMsg(s)
 43     #發送信息給用戶
 44 if __name__ == '__main__':
 45     #設置一個全局的變量,保存全部進入聊天室的用戶信息{'地址':'暱稱','地址':'暱稱',....}
 46     users = {}
 47     # print(users)
 48     main()
 49 
 50 
 51 
 52 #客戶端
 53 from socket import *
 54 import json
 55 from threading import Thread
 56 def sendMsg(c,server):
 57     while True:
 58         msg = input("").strip()
 59         #發送消息
 60         if not msg:
 61             continue
 62         elif msg.lower() == 'quit':
 63             # 發送進入聊天室的信息
 64             msg = {'type': 'quit', 'content': username}
 65             c.sendto(json.dumps(msg).encode('utf-8'), server)
 66             break
 67         #私聊
 68         elif msg.startswith('@'):
 69             name = str(msg[1:])
 70             msg2 = input('>>請輸入你要對他說的話: ').strip()
 71             msg3 = {'type':'msg2','content':msg2,'name':name}
 72             print(">>我對%s說: %s"%(name ,msg2))
 73             c.sendto(json.dumps(msg3).encode('utf-8'),server)
 74         else:
 75             #正常信息
 76             msg1 = {'type':'msg','content':msg}
 77             print(">>我說:%s"%msg)
 78             c.sendto(json.dumps(msg1).encode('utf-8'), server)
 79 
 80 def recvMsg(c):
 81     while True:
 82         data,address = c.recvfrom(1024)
 83         #打印出接收到的消息
 84         print(data.decode('utf-8'))
 85 
 86 def main():
 87     c = socket(AF_INET,SOCK_DGRAM)
 88     #服務器的地址
 89     server = ('172.16.11.199',8888)
 90     #發送進入聊天室的信息
 91     msg = {'type':'enter','content':username}
 92     c.sendto(json.dumps(msg).encode('utf-8'),server)
 93     #用戶發送消息
 94     t1 = Thread(target=sendMsg,args=(c,server))
 95     #用戶接收消息
 96     t2 = Thread(target=recvMsg,args=(c,))
 97 
 98     t1.start()
 99     t2.start()
100     t1.join()
101     t2.join()
102 
103     c.close()
104 if __name__ == '__main__':
105     #輸入暱稱
106     username = input('暱稱:').strip()
107     print("%s,你已成功進入xx聊天室,想要退出請輸入'quit'"%username)
108     main()
相關文章
相關標籤/搜索