python - 将 Android 应用程序连接到 Python 服务器
问题描述
我正在编写一个程序,将一个字符串对象(最终是图像,但从小开始)从 Android 应用程序发送到 python 服务器。
我的 python 服务器现在非常小,它只是监听然后打印它接收到的内容。
import socket
import sys
print("---------------------------------------------")
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_addy = ("localhost", 5589)
print("starting up on %s with port %s" % server_addy)
socket.bind(server_addy)
socket.listen(1)
while True:
print("Waiting on connection...")
print("---------------------------------------------")
connection, client_addy = socket.accept()
print("Connection Accepted")
try:
print("Connection received from...", client_addy)
while True:
data = connection.recv(1024)
print("Received \" %s \" from connection" % data)
connection.close()
break
finally:
print("Closing Connection to ", client_addy)
connection.close()
我已经用另一个能够连接到该服务器并从该服务器发送/接收数据的 python 客户端对此进行了测试。所以在我的 Android 应用程序方面,我有
public class score_verify extends AppCompatActivity {
private String input_score;
private Pattern pattern = Pattern.compile("[0-9]+");
private Socket socket;
private String url = "localhost";
private String metadata;
private int port = 5589;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_score_verify);
Button submit = (Button) findViewById(R.id.submit);
final EditText score = (EditText) findViewById(R.id.input);
final CheckBox box = (CheckBox) findViewById(R.id.verify);
metadata = getIntent().getStringExtra("metadata");
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
input_score = score.getText().toString();
if(!pattern.matcher(input_score).matches()) {
Toast.makeText(score_verify.this, "Please Enter A Valid Score", Toast.LENGTH_LONG).show();
}
else if(!box.isChecked()) {
Toast.makeText(score_verify.this, "Please Verify that the Information is Correct", Toast.LENGTH_LONG).show();
}
else {
try {
metadata += ("," + input_score);
metadataTask task = new metadataTask();
task.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
实际的连接代码是
private class metadataTask extends AsyncTask<Void, Void, Void> {
PrintWriter printWriter;
@Override
protected Void doInBackground(Void...params) {
try {
socket = new Socket(url, 5589);
printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write("Connecting!...");
printWriter.flush();
printWriter.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
对于我有 URL 的第一部分,我用“127.0.0.1”、“localhost”和“10.0.2.2”尝试过它,我得到连接超时或(使用 localhost)连接被拒绝错误。
我有
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
在我的清单中以及任何帮助将不胜感激,我的诊断这个问题的能力即将结束
平结果:
Pinging 192.168.1.89 with 32 bytes of data:
Reply from 192.168.1.232: Destination host unreachable.
Reply from 192.168.1.89: bytes=32 time=49ms TTL=64
Reply from 192.168.1.89: bytes=32 time=130ms TTL=64
Reply from 192.168.1.89: bytes=32 time=37ms TTL=64
Ping statistics for 192.168.1.89:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 37ms, Maximum = 130ms, Average = 72ms
解决方案
您的 python 代码似乎在 while 循环中永远持续地接受连接,这会阻止它进入 try 块。还将地址参数更改server_addy
为 server_addy = ('', "port")
为您提供以下代码
import socket
import sys
print("---------------------------------------------")
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_addy = ('', 5600)
print("starting up on %s with port %s" % server_addy)
socket.bind(server_addy)
socket.listen(1)
while True:
print("Waiting on connection...")
print("---------------------------------------------")
connection, client_addy = socket.accept()
print("Connection Accepted")
try:
print("Connection received from...", client_addy)
while True:
data = connection.recv(1024)
print("Received \" %s \" from connection" % data)
connection.close()
break
finally:
print("Closing Connection to ", client_addy)
connection.close()
这将一次提供单个客户端连接,并且在关闭连接时它将接受下一个连接。在 android 部分使用两个地址中的任何一个进行连接:
- 您的私有 IP 地址 (192.168.0.0)
- 或者,10.0.2.2