私はサーバに接続するための短いテストアプリを書いています。すべてのアプリケーションは、editTextボックスからIPを取得し、サーバーに接続します。私はサーバーにデータを送信し、サーバーがそれを印刷することができるので、私はサーバーに接続できるように見えます。TCPソケットがアンドロイドアプリに接続されているかどうかを確認する方法
私は私がサーバーに何かを送信しようとする前に接続していたことを確認するためにチェックするいくつかのエラーを追加したいです。しかし、問題は、私がSocket.isConnected()またはisBound()メソッドを使用するたびにアプリケーションがクラッシュすることです。
私は接続していた場合、これらのメソッドは動作していないようならば、どのように私がチェックします。私が言ったように、私は物事をサーバーに送ることができるので、私は接続されていることを知っています。
以下はコードですが、ボタンを押すと接続されます。私がしたいのは、私が接続されていることを確認し、バックグラウンドで動作し、サーバーからデータを送受信するスレッドを開始することです。 s.isBound()は、プログラムがクラッシュする場所です。私はs.isConnected()に入れることもでき、クラッシュします。
最後に、isBoundとisConnectedの違いは何ですか?
private OnClickListener connectListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (!connected) {
serverIpAddress = serverIp.getText().toString();
if (!serverIpAddress.equals("")) {
try{
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
Log.d("ClientActivity", "Trying to Connect");
s = new Socket(serverAddr, SERVERPORT);
Log.d("ClientActivity", "Connected");
output = s.getOutputStream();
input = s.getInputStream();
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
if(s.isBound()){
connected = true;
cThread = new Thread(new ClientThread());
cThread.setName("Client Connection Thread");
cThread.start();
}
}
}
}
};
これはログの出力です。
11-13 17:03:56.718: D/ClientActivity(2039): Trying to Connect
11-13 17:03:56.757: W/System.err(2039): java.net.ConnectException: /192.168.16.1:6340 - Connection refused
11-13 17:03:56.757: W/System.err(2039): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:207)
11-13 17:03:56.757: W/System.err(2039): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
11-13 17:03:56.757: W/System.err(2039): at java.net.Socket.startupSocket(Socket.java:705)
11-13 17:03:56.757: W/System.err(2039): at java.net.Socket.<init>(Socket.java:263)
11-13 17:03:56.757: W/System.err(2039): at com.AUIEE.client_test.Client_TestActivity$1.onClick(Client_TestActivity.java:88)
11-13 17:03:56.757: W/System.err(2039): at android.view.View.performClick(View.java:2485)
11-13 17:03:56.765: W/System.err(2039): at android.view.View$PerformClick.run(View.java:9089)
11-13 17:03:56.765: W/System.err(2039): at android.os.Handler.handleCallback(Handler.java:587)
11-13 17:03:56.765: W/System.err(2039): at android.os.Handler.dispatchMessage(Handler.java:92)
11-13 17:03:56.773: W/System.err(2039): at android.os.Looper.loop(Looper.java:130)
11-13 17:03:56.773: W/System.err(2039): at android.app.ActivityThread.main(ActivityThread.java:3859)
11-13 17:03:56.773: W/System.err(2039): at java.lang.reflect.Method.invokeNative(Native Method)
11-13 17:03:56.773: W/System.err(2039): at java.lang.reflect.Method.invoke(Method.java:507)
11-13 17:03:56.773: W/System.err(2039): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:840)
11-13 17:03:56.773: W/System.err(2039): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:598)
11-13 17:03:56.773: W/System.err(2039): at dalvik.system.NativeStart.main(Native Method)
11-13 17:03:56.781: D/AndroidRuntime(2039): Shutting down VM
11-13 17:03:56.781: W/dalvikvm(2039): threadid=1: thread exiting with uncaught exception (group=0x4001e560)
11-13 17:03:56.789: E/AndroidRuntime(2039): FATAL EXCEPTION: main
11-13 17:03:56.789: E/AndroidRuntime(2039): java.lang.NullPointerException
11-13 17:03:56.789: E/AndroidRuntime(2039): at com.AUIEE.client_test.Client_TestActivity$1.onClick(Client_TestActivity.java:103)
11-13 17:03:56.789: E/AndroidRuntime(2039): at android.view.View.performClick(View.java:2485)
11-13 17:03:56.789: E/AndroidRuntime(2039): at android.view.View$PerformClick.run(View.java:9089)
11-13 17:03:56.789: E/AndroidRuntime(2039): at android.os.Handler.handleCallback(Handler.java:587)
11-13 17:03:56.789: E/AndroidRuntime(2039): at android.os.Handler.dispatchMessage(Handler.java:92)
11-13 17:03:56.789: E/AndroidRuntime(2039): at android.os.Looper.loop(Looper.java:130)
11-13 17:03:56.789: E/AndroidRuntime(2039): at android.app.ActivityThread.main(ActivityThread.java:3859)
11-13 17:03:56.789: E/AndroidRuntime(2039): at java.lang.reflect.Method.invokeNative(Native Method)
11-13 17:03:56.789: E/AndroidRuntime(2039): at java.lang.reflect.Method.invoke(Method.java:507)
11-13 17:03:56.789: E/AndroidRuntime(2039): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:840)
11-13 17:03:56.789: E/AndroidRuntime(2039): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:598)
11-13 17:03:56.789: E/AndroidRuntime(2039): at dalvik.system.NativeStart.main(Native Method)
isBound()またはisConnected()を使用してプログラムがクラッシュすると、ログアウト出力を追加します。 – Manos
OK、私はそれを追加しました。 –
Ok、 私はそれを理解したと思います。接続できない場合、ソケットはnullを返します。ですから、s == nullならチェックする必要があります。 また、s =新しいSocket();サーバーが使用可能なときにメソッドが例外をスローします。コードのcatchセクションを使用して残りのすべてを処理するものを書くのが適切でしょうか?たとえば、catchステートメントが実行されるときに、「サーバーが見つかりません」というトーストメッセージを追加できます。または、これを処理するより良い方法はありますか? –