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


    在我们创建普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())
  • 相关阅读:
    supervisor(一)基础篇
    linux添加开机自启动脚本示例详解
    suse 不能远程登录
    LintCode,hihoCoder,LeetCode有什么区别?
    windows 下安装nodejs 要怎么设置环境变量
    Java 集合:HashSet 与 ArrayList
    Java ArrayList、Vector和LinkedList等的差别与用法(转)
    一行代码实现java list去重
    25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?
    Chart: Who pays the most in Seattle for software engineers
  • 原文地址:https://www.cnblogs.com/austinjoe/p/9657236.html
Copyright © 2020-2023  润新知