Ich versuche über Sockets eine Verbindung zwischen einer Android-Anwendung und einem Python-Skript herzustellen.AsyncTask - Verbindung über Sockets nicht möglich
Dieser Java-Code funktioniert absolut fantastisch mit meinem Python-Server.
import java.io.*;
import java.net.*;
public class client {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",5000);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){System.out.println(e);}
}
}
Allerdings, wenn ich versuche, es in meiner Android-Anwendung zu implementieren (siehe unten), habe ich das Gefühl, dass die doInBackground()
nicht einmal genannt:
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.DataOutputStream;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView myText = (TextView) findViewById(R.id.TextView1);
Connect myConnect = new Connect();
myConnect.execute();
String myResult = Integer.toString(myConnect.getResult());
myText.setText(myResult);
}
}
class Connect extends AsyncTask<Void, Void, Integer> {
int result = 0;
@Override
protected void onPreExecute(){
result = 1;
}
@Override
protected Integer doInBackground(Void... params) {
try{
result = 2;
Socket s=new Socket("localhost",5000);
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){
result = -1;
return -1;
}
result = 3;
return 3;
}
@Override
protected void onProgressUpdate(Void... values) {
}
int getResult(){
return result;
}
}
Was ist Ich vermisse hier, damit es funktioniert?
Sie vermissen, was 'localhost' bedeutet ... fragte bazillion mal Suche verwenden ... Hinweis: Wird Python-Skript auf Gerät/Emulator selbst ausgeführt? Nein? Warum benutzen Sie dann localhost? – Selvin
'localhost' zeigt auf' mich'. Also wird der Aufruf von 'localhost' auf dem Emulator versuchen, sich mit dem Emulator zu verbinden. Auf dem PC wird eine Verbindung zum PC hergestellt. Wenn Sie auf dem Android-Gerät anrufen, versuchen Sie, sich mit 'selbst' zu verbinden. Laufen Sie den Server auch auf dem Emulator? Ofcource nicht. –
Darüber hinaus wird AsyncTask asynchron von Ihrem Hauptthread ausgeführt. Wenn Sie 'getResult' aufrufen, wird' doInBackground' noch nicht ausgeführt oder das Ergebnis wurde nicht gesetzt, auch wenn die Adresse korrekt angegeben wurde. – 0xDEADC0DE