2017-01-30 4 views
-2

Я пытаюсь установить соединение между Android-приложением и скриптом Python через сокеты.AsyncTask - Не удается подключиться через сокеты

Этот Java-код работает абсолютно фантастически с моим Python-сервером.

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

Однако, когда я пытаюсь реализовать это в моем Android приложения (смотрите ниже), у меня есть ощущение, что doInBackground() даже не называется:

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

Что я Я здесь пропал, чтобы заставить его работать?

+0

у вас отсутствует то, что означает 'localhost' ... спросил bazillion раз использовать поиск ... подсказка: скрипт python работает на самом устройстве/эмуляторе? нет? то почему вы используете localhost? – Selvin

+0

'localhost' указывает на' себя'. Поэтому вызов 'localhost' на эмуляторе будет пытаться подключиться к эмулятору. Вызов его на ПК будет подключен к ПК. Вызов его на Android-устройстве попытается подключиться к 'самому'. Вы также запускаете сервер на эмуляторе? ofcource вы этого не делаете. –

+0

Кроме того, как вы могли ожидать, 'AsyncTask' запускается асинхронно из основного потока. К тому времени, когда вы вызываете 'getResult',' doInBackground' еще не запущен или еще не установил результат, даже если адрес был правильно указан – 0xDEADC0DE

ответ

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

Это должно быть

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

при использовании эмулятора.

 Смежные вопросы

  • Нет связанных вопросов^_^