0

ネットワーキングは苦痛です。AsyncTasks を使用するサービスで、ソケット通信を開始しようとします。

public class TransmitService extends Service {

    private Socket echoSocket = null;
    private static PrintWriter out = null;
    private String HOST = null;
    private int PORT = -1;
    private static Context context;
    public static boolean isConnected = false;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO do something useful
        context = getApplicationContext();
        HOST = intent.getExtras().getString("HOST");
        PORT = intent.getExtras().getInt("PORT");
        Toast.makeText(context, "HOST/PORT: "+HOST+"/"+PORT, Toast.LENGTH_LONG).show();
        new initNetworkTask().execute();
        return Service.START_NOT_STICKY;
    }

    // Send the orientation data
    public static void sendData(float f1, float f2, float f3) {
        new sendDataTask().execute(f1, f2, f3);
    }

    static class sendDataTask extends AsyncTask<Float, Void, Void> {

        @Override
        protected Void doInBackground(Float... params) {
            try {
                JSONObject j = new JSONObject();
                j.put("yaw", params[0]);
                j.put("pitch", params[1]);
                j.put("roll", params[2]);
                String jString = j.toString();
                out.println(jString);
            } catch (Exception e) {
                Log.e("sendDataTask", e.toString());
            }
            return null;
        }

    }

    class initNetworkTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                echoSocket = new Socket(HOST, PORT);
                out = new PrintWriter(echoSocket.getOutputStream(), true);
                out.println("Welcome.");
                isConnected = true;
            } catch (Exception e) {
                Log.e("initNetworkTask", e.toString());
                isConnected = false;
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO for communication return IBinder implementation
        return null;
    }
}

私の「サーバー」は、ラップトップで実行されている単なる python スクリプトです。

import socket

HOST = '192.168.###.#'     #(numbers omitted from S/O question)             
PORT = 10000             
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if data is not None:
        print data
conn.close()

次のサーバーは、同じラップトップで実行されているこの Java クライアントで問題なく動作します。

public class DataSender {
    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;
        PrintWriter out = null;
        //BufferedReader in = null;

        try {
            echoSocket = new Socket("192.168.###.#", 10000);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            //in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for " + "the connection to: taranis.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;

        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput); //out.println - THIS IS HOW DATA IS SENT
            //System.out.println("echo: " + in.readLine());
        }

        out.close();
        //in.close();
        stdIn.close();
        echoSocket.close();
    }
}

私は本当にこれを私の Android アプリで動作させたいと思っています。私の目的は、方向データをTransmitService.sendData(f1,f2,f3)ラップトップに継続的にストリーミングすることです。

テストに関しては、Windows ファイアウォールをオフにし、同じ WiFi 接続 (スターバックス) でテストし、他のいくつかのポート (80、4444、4445、5000) を試しました。

Android アプリで表示されるコメント エラーは次のとおりです。

java.net.ConnectException: failed to connect to /192.168.###.# (port 10000): connection failed: ETIMEDOUT (Connection timed out)

ご覧いただきありがとうございます。この問題を解決するために、より多くの情報を提供するか、さらにテストを実行していただければ幸いです。インターネット経由で携帯電話からラップトップに方向データを送信するための他のソリューションを検討することにも興味があります。

4

1 に答える 1

1

ああ、これはばかげて恥ずかしいです。基本的に、間違った IP アドレス (192.168....) を使用していました。

Windows では ipconfig (Linux: ifconfig) を使用して、無線 LAN (wlan) に対応する IP アドレスを選択します。仮想マシンまたはがらくたに対応する別の IP アドレスを使用していました。

これが将来誰かに役立つことを願っています。私はこの種の問題が嫌いです。

于 2013-07-23T01:11:59.970 に答える