Подключение приложения Android к серверу Python - PullRequest
0 голосов
/ 24 сентября 2019

Я пишу программу для отправки объекта String (и, в конечном итоге, изображения, но начинающего с малого) из приложения 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" />

и в моем манифесте. Буду признателен за любую помощь, у меня почти закончится диагностировать эту проблему

Ping Результаты:

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

1 Ответ

0 голосов
/ 24 сентября 2019

Ваш код 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...