Python我正在尝试运行一个主逻辑(游戏服务器)循环与asyncio start_服务器等待TCP traffi并发运行

2024-09-29 17:15:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有一个脚本,它使用asyncio监听TCP端口上的任何传入连接,如果接收到连接,它将解析数据并为接收到的数据设置一个类变量。在

这对于等待传入的连接来说是完美的,但是我无法想出如何在等待传入连接的同时运行一个循环。我正在构建一个通过TCP接收输入的服务器,并在main()函数的循环中更新缓存中存储的内容。在

这是我目前所拥有的:

import socket
import binascii
import struct
import asyncio

TCP_IP = '127.0.0.1'
TCP_PORT = 30194
BUFFER_SIZE = 1024

loop = asyncio.get_event_loop()
coro = asyncio.start_server(incomingData, TCP_IP, TCP_PORT)
server = loop.run_until_complete(coro)

try:
    loop.run_forever()

except KeyboardInterrupt:
    pass

# Async method to handle incoming connections

async def incomingData(reader, writer):
    data = await reader.read(BUFFER_SIZE)
    incomingMessage = data.decode()
    addr = writer.get_extra_info('peername')
    print("Received %r from %r" % (incomingMessage, addr))

    # [0] login packet
    if ord(incomingMessage[0]) == 0:
        username = ""
        password = ""
        try:
            usernameLength = ord(incomingMessage[1]) + 2 # plus two for the 2 chars taken up by the hex
            passwordLength = ord(incomingMessage[usernameLength]) + 1 + usernameLength

            for x in range(2,usernameLength):
                username += incomingMessage[x]

            for i in range(usernameLength,passwordLength):
                password += incomingMessage[i]

            loginHandler.username = username
            loginHandler.password = password

    except:
        print("Unexpected error")

writer.write(data)
await writer.drain()
writer.close()

但是,如果我添加一个循环来包含loop.run_forever(),那么它只输出一次打印线,再也不会输出(我希望它在一个循环中打印几百次)-例如:

^{pr2}$

将在执行中只打印一次-如何使逻辑循环与异步TCPstart_server循环并行运行?在


Tags: 数据runimportloopasynciofordataserver

热门问题