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