码迷,mamicode.com
首页 > 其他好文 > 详细

socket聊天室

时间:2019-05-23 12:11:45      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:code   thread   聊天室   start   退出   其它   use   bind   发送信息   

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

 

socket聊天室

标签:code   thread   聊天室   start   退出   其它   use   bind   发送信息   

原文地址:https://www.cnblogs.com/wshr210/p/10911074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!