zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    桐花万里python路-基础篇-01-历史及进制
    linux-tar归档文件
    python-常识
    目录权限修改
    linux常用命令
    battery-historian 使用方法
    cp --复制命令
    adb与bat混用启动与杀死应用程序
    monkey 命令
    INSERT INTO SELECT 语句
  • 原文地址:https://www.cnblogs.com/wshr210/p/10911074.html
Copyright © 2011-2022 走看看