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()

 

posted @ 2019-05-23 11:55  岩小鱼  阅读(511)  评论(0编辑  收藏  举报