python -- socket群聊,广播聊天消息

2 篇文章 0 订阅

socket群聊,广播聊天消息

### server端

#python select io多路复用测试代码
#1. 简单的使用select来进行客户端多连接

import select
import socket
import queue

#select 把socket放入 select中,然后每当有一个连接过来,把连接conn放入select模型里面去
port = 19869
ip = "127.0.0.1"
ss = socket.socket()
ss.bind((ip, port))
ss.listen(10)
read_list = [ss]
write_list = []
msg_list = []
while 1:
    rlist, wlist, xlist = select.select(read_list, write_list, [], 1)
    for i in rlist:
        if i is ss:
            # 如果ss准备就绪,那么说明ss就可以接受连接了,当ss接受到连接
            # 那么把连接返回readlist
            conn, addr = i.accept()
            read_list.append(conn)
        # 如果不是socket对象,那么就是conn连接对象了,如果是conn连接对象,那么就代表有
        # 读入数据的变化,对应recv方法
        else:
            try:
                data = i.recv(1024)
                # 如果接受不到数据了 则说明连接已经关闭了
                if not data:
                    print('connecting close')
                    read_list.remove(i)
                    break
                # 我们去发送数据,但是我们要把conn准备好了再去发送
                # 所以首先把数据存在一个dict中msg_list,然后再等他准备好的时候
                msg_list.append(data)
                for i in read_list:
                    if i is not ss:
                        write_list.append(i)
            except Exception:
                read_list.remove(i)
    for j in range(len(wlist)):
        conn = wlist[j]
        # 把对应各自的消息取出来
        if j == len(wlist) -1:
            msg = msg_list.pop()
        else:
            msg = msg_list[0]
        try:
            conn.send(msg)
            # 回复完成后,一定要将outputs中该socket对象移除
            write_list.remove(conn)
        except Exception:
            # 如果报错就所以连接或者已经断开了,那么我们就把他移出出去
            write_list.remove(conn)




## client端
   #python select io多路复用测试代码
   #简单的使用select来进行客户端多连接
import select
import socket
#1. 读  2.写  3.报错

#1. read  2. write  3. 报错时间

ss = socket.socket()


ss.bind(('0.0.0.0',19530))
ss.listen()

readlist = [ss]
writelist = []
errorlist = []

while 1:
    rlist, wlist, xlist = select.select(readlist, writelist, errorlist)
    #如果向下执行了,就说明发生了事件
    if rlist:
        for i in rlist:
            if i is ss:
                conn, addr = i.accept()
                readlist.append(conn)
            else:
                msg = i.recv(1024)
                print(msg)
                readlist.remove(i)
                writelist.append(i)

    if wlist:
        for i in wlist:
            i.send(b'hello')
            writelist.remove(i)
            readlist.append(i)
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值