python TCP服务器v1.4 - 客户端连接服务器异常(异常情况分类)处理

18 篇文章 1 订阅
16 篇文章 0 订阅

TCP聊天服务器套接字v1.4

所有版本记录:
v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread(含日志,html)+anaconda打包32位exe(3.4万字)|python高阶
v1.1 : python TCP套接字服务器v1.1-新增服务端命令功能及修改bug(socket+PyQt5)

v1.2 : python TCP服务器v1.2 - 服务端新增用户登录注册(json, md5加密)
v1.3 : python TCP服务器v1.3 - 服务器抗压测试及关闭套接字处理

连接服务器异常情况处理

class Socket():
	...
    def socket_connect(self):
        if hasattr(self, "_socc"):
            self.retry() #socket多次连接不同地址会出现 `OSError: [WinError 10022] 提供了一个无效的参数.`
        else:
            self._socc = True
        try:
            self.socket.connect(self.addr)
        except socket.gaierror:
            return f"获取地址信息失败.请确保{self.addr[0]}是有效地址或ipv4/ipv6"
        except socket.timeout:
            return f"连接超时({TIMEOUT}s).服务器[{self.addr[0]}:{self.addr[1]}]连接失败."
        except OverflowError:
            return f"输入的端口号为{self.addr[1]},端口号必须在0~65535间."
        except ConnectionResetError:
            pass
        except OSError as e:
            if int(self.addr[1]) == 0:
                return "[WinError 10049] 在其上下文中,该请求的地址无效"
            return str(e.args[1]).rstrip('。')
        except TypeError:
            return f"网络地址格式错误: 格式[ip:port] port必须为整型变量0~65535间."
        except:
            logging.exception(msg=str())
        else:
            return True

    def connect(self, ip = None,port:int=0000, show=lambda: None):
        if ip is None:
            assert hasattr(self,"addr"), "ip address is empty."
        else:
            self.addr = (ip, port)

        result = self.socket_connect()
        if result is True:
                show("[{}]: 连接成功".format(get_time()))
                s._connect = True
                return True
        else:
            show(f"[{get_time()}]: {result}")
            s._connect = False
            return False

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,关于您的问题,可以通过Python的asyncio模块的创建服务器函数(如`asyncio.start_server`)来创建一个服务器对象,在服务器对象上监听客户端连接。当有客户端连接时,`asyncio.start_server`会返回一个`asyncio.StreamingServer`对象,这个对象具有一个`asyncio.streams.StreamReaderProtocol`属性,该属性可以用于读取客户端连接的数据。 例如,以下示例代码演示了如何使用`asyncio.start_server`来创建并启动一个服务器对象,并监听客户端连接: ``` python import asyncio async def handle_echo(reader, writer): data = await reader.read(100) message = data.decode() print(f"Received {message!r} from {writer.get_extra_info('peername')!r}") writer.write(data) await writer.drain() print(f"Sent {message!r} back to {writer.get_extra_info('peername')!r}") writer.close() async def main(): server = await asyncio.start_server(handle_echo, '127.0.0.1', 8888) async with server: await server.serve_forever() asyncio.run(main()) ``` 在上面的示例中,`handle_echo`函数是一个异步的回调函数,用于处理接收到的客户端连接。`asyncio.start_server`函数创建一个服务器对象,它以`handle_echo`函数为回调函数处理客户端的请求,监听 IP 地址为 `127.0.0.1`,端口号为 `8888` 的连接。 在服务器对象的 `serve_forever` 方法中,它将持续运行并监听客户端连接。当有客户端连接时,服务器会调用 `handle_echo` 函数来处理连接。在 `handle_echo` 函数中,我们可以通过 `reader` 对象来读取客户端发送来的消息,通过 `writer` 对象来向客户端发送数据。 对于您提到的Python asyncio的服务器模块如何获取客户端连接对象的问题,我们可以通过 `asyncio.start_server` 返回的`StreamingServer`对象来获取客户端连接对象,其中包含了客户端连接的信息,例如IP地址和端口等信息。通过`writer`对象可以向客户端写入数据,而`reader`对象可以读取客户端发送的消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值