首页 > 解决方案 > 无法与 python 服务器建立 telnet 连接

问题描述

我正在尝试设置一个 python 服务器来连接一个用 Java 编写的 android 应用程序。因为我想要一个主循环在 python 程序中继续运行,所以我正在使用 Asyncio 的传输和协议。

我一直在查看有关传输和协议的文档,并使用了页面底部的服务器示例。这导致以下代码:

class ServerProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))
        self.transport = transport

    def data_received(self, data):
        message = data.decode()
        print('Data received: {!r}'.format(message))
        
        if message == 'cmd_configure':
            configuration.configuration()
            print('configuration done')

        print('Close the client socket')
        self.transport.close()
        
        

async def connect():
    server = await loop.create_server(
        lambda: ServerProtocol(),
        '192.168.0.157', 65432)

    async with server:
        await server.serve_forever()


async def main_cycle(i, o, p):
    while True:
        i, o, p = hard_io.main(i, o, p)
        await asyncio.sleep(0.001)
        
async def main(inp, outp, prevs):        
    task1 = loop.create_task(main_cycle(inp, outp, prevs))
    task2 = loop.create_task(connect())
    await asyncio.wait([task1, task2])

loop = asyncio.get_event_loop()
loop.run_until_complete(main(ins, outs, ins_prev_cycle))

当我在另一台机器上使用客户端示例时,连接似乎工作正常。当我尝试使用 android studio 的仿真和以下 Java 代码进行连接时,它不起作用

public class ConnectionClass extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void... voids) {
        try {
            InetAddress serverAddr = InetAddress.getByName("192.168.0.157");
            Log.e("TCP Client", "C: Connecting...");
            Socket socket = new Socket(serverAddr, 65432);
            System.out.println("connection made");
        } catch (Exception e) {

            System.out.println("failed to establish connection");
            Log.e("TCP", "S: Error", e);
        }
        return null;
    }
}

因为我什至无法从终端使用 telnet 进行连接,所以我感觉我误解了服务器端的传输和协议。我想做的事情出了什么问题?我刚刚开始使用这个(客户端/服务器连接),所以如果我错过了对我的问题的明显答案,请原谅我。

编辑

所以这就是发生的事情:

python服务器端运行良好,没有任何错误。当我在一台机器上运行此代码并在另一台机器上运行传输和协议文档中的客户端示例时,服务器打印“来自 { CLIENT-IP } 的连接”,客户端发送一条消息,服务器关闭连接。所以这意味着建立了 TCP 连接并且客户端和服务器之间的消息正常。当我从上面运行 Java 客户端代码而不是文档中的客户端示例时,我希望服务器打印相同的结果“来自 { CLIENT-IP } 的连接”。我还没有用 Java 编写任何代码来发送消息,所以我不希望发生更多事情。但是,客户端打印“TCP Client”、“C: Connecting...”,然后转到下一行代码:Socket socket = new Socket(serverAddr, 65432);然后超时并出现以下错误:java.net.ConnectException: failed to connect to /192.168.0.157 (port 65432) from /:: (port 49580): connect failed: ETIMEDOUT (Connection timed out)

因为我认为服务器正在打开一个端口,所以我也应该能够telnet 192.168.0.157::65432从命令窗口访问服务器。当我尝试这个时它也失败了:Connecting To 192.168.0.157::65432...Could not open connection to the host, on port 23: Connect failed所以这让我觉得我在服务器端的 python 代码中做错了什么?

标签: pythonandroidtcpprotocolspython-asyncio

解决方案


推荐阅读