网络编程(三):非阻塞套接字

在我们创建普y通的Socket时知道,accept()和recv()都是会阻塞的,也就是意味着程序会在运行到这里时终止,而且一次只能连接一个客户端,必须等这个客户端处理结束才能继续连接,那么如何让程序不终止并且可以连接多个客户端呢?

通过  setblocking(False语句让程序不阻塞,但是如果服务端运行起来却没有客户端连接,程序就会退出,所以我们需要让程序一直在循环中等待连接,当客户端连接后就去进行消息处理,如果有其他客户端连接因为接受连接的请求一直都在所以可以继续连接。来看代码。

服务端

 

import socket
server=socket.socket()
server.setblocking(False)        #设置服务为非阻塞
server.bind(('0.0.0.0',9999))
server.listen()
print("开始监听>>>>>")
connection=[]                  #用于存储每个连接的客户端对象
while True:
    try:
        coon,addr=server.accept()
        coon.setblocking(False)    #连接设置为非阻塞
        connection.append(coon)     #将连接的客户端加入列表中
        print("用户{}连接".format(addr))
    except BlockingIOError as e:   #捕捉没有连接的异常
        pass
    new_connection=connection.copy()#连接对象列表的拷贝防止退出连接的对象从列表中移除带来的问题
    for co in new_connection:           #循环遍历连接对象来监听此时是否有通信
        try:
            data_recv=co.recv(1024)
            print("接收到的消息为:",data_recv)
            if data_recv==b'':     #如果收到空数据,将连接对象从列表中移除
                connection.remove(co)
            else:
                co.send(data_recv)
        except BlockingIOError as e:
            pass

 

客户端

import socket
client=socket.socket()
client.connect(('127.0.0.1',9999))
while True:
    data=input("请输入要发送的数据:")
    data=data.encode()
    client.send(data)
    print("接收到的数据是:",client.recv(1024).decode())

 

转载于:https://www.cnblogs.com/austinjoe/p/9657236.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值