-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;
}
}
Что я Я здесь пропал, чтобы заставить его работать?
у вас отсутствует то, что означает 'localhost' ... спросил bazillion раз использовать поиск ... подсказка: скрипт python работает на самом устройстве/эмуляторе? нет? то почему вы используете localhost? – Selvin
'localhost' указывает на' себя'. Поэтому вызов 'localhost' на эмуляторе будет пытаться подключиться к эмулятору. Вызов его на ПК будет подключен к ПК. Вызов его на Android-устройстве попытается подключиться к 'самому'. Вы также запускаете сервер на эмуляторе? ofcource вы этого не делаете. –
Кроме того, как вы могли ожидать, 'AsyncTask' запускается асинхронно из основного потока. К тому времени, когда вы вызываете 'getResult',' doInBackground' еще не запущен или еще не установил результат, даже если адрес был правильно указан – 0xDEADC0DE