2017-01-30 5 views
-2

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; 
    } 
} 

enter image description here

Was ist Ich vermisse hier, damit es funktioniert?

+0

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

+0

'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. –

+0

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

Antwort

1
Socket s=new Socket("localhost",5000);. 

Das

Socket s=new Socket("10.0.2.2",5000); 

bei Verwendung eines Emulators sein sollte.

Verwandte Themen