python - 无法与 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 代码中做错了什么?
解决方案
推荐阅读
- excel - 基于两个条件查找并替换值的 VBA 代码
- php - ACF 字段未显示在主页上
- ios - UITableViewCell 默认选中/高亮状态的颜色值是多少?
- docker - TensorFlow 模型服务器 - 无法解析主机 POST
- ios - 带有 ScrollView 的 NavigationView 具有意外的速度(或没有动画) - 大标题 + ScrollView - SwiftUI - iOS 14
- xamarin.android - Xamarin Android - 自定义地图图像异步
- javascript - 如果每个字符串中的第一个字符相同,则从数组中的每个字符串中删除第一个字符
- javascript - 为什么在javascript中未定义console.log(XHR.responceText)日志记录
- cookies - 将 localhost 连接到远程开发服务器(CORS、同站点、安全和其他令人头疼的问题)
- visual-studio - Azure 函数在 function.json 的本地缺少绑定