我正在尝试设置一个python服务器,以使用Java编写的android应用程序连接至该服务器。因为我希望主循环继续在python程序中运行,所以我使用了Asyncio的传输和协议。
我一直在查看有关传输和协议的文档,并使用了页面底部的server example。这将导致以下代码:
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))
当我在另一台计算机上使用client example时,连接似乎可以正常工作。当我尝试使用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客户端”,“ C:正在连接...”,然后转到下一行代码: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代码中做错了什么?