【问题标题】:AsyncTask - Can't connect via socketsAsyncTask - 无法通过套接字连接
【发布时间】:2017-01-30 13:05:38
【问题描述】:

我正在尝试通过套接字在 Android 应用程序和 Python 脚本之间建立连接。

这段 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 的意思......问了无数次使用搜索......提示:python 的脚本是否在设备/模拟器本身上运行?不?那你为什么要使用 localhost?
  • localhost 指向myself。所以在模拟器上调用localhost 会尝试连接到模拟器。在 PC 上调用它会连接到 PC。在 Android 设备上调用它会尝试连接到itself。您是否也在模拟器上运行服务器?当然你不知道。
  • 此外,正如您所料,AsyncTask 从您的主线程异步运行。当您调用getResult 时,doInBackground 尚未运行或尚未设置结果,即使地址已正确指定
  • @0xDEADC0DE 很好,但它永远不会到达服务器:C:\Python27\python.exe C:/Users/VWKY61Q/PycharmProjects/Sockets/server.py 0.0000 - 启动服务器 0.0320 - 正在打开端口 localhost 在 5000 0.0320 - 服务器建立 0.0320 - 等待客户端
  • @VladMatvienko 我添加了实际 IP 但什么也没发生

标签: java android sockets android-asynctask


【解决方案1】:
Socket s=new Socket("localhost",5000);. 

应该是这样的

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

使用模拟器时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2014-03-01
    相关资源
    最近更新 更多