zoukankan      html  css  js  c++  java
  • 网络编程(三):非阻塞套接字

    在我们创建普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())
  • 相关阅读:
    vue组件上绑定原生事件
    vue中sync的使用原来这么简单
    vscode快捷键
    justify-content: space-between能够对齐的解决办法
    day_01:__all__、__init__、推导式
    单元测试框架pytest
    ELK从入门到实战
    HTB::Return
    Codeforces Round #752 (Div. 2) ABCD
    动态神经网络综述阅读笔记
  • 原文地址:https://www.cnblogs.com/austinjoe/p/9657236.html
Copyright © 2011-2022 走看看