2

携帯電話からパソコンにデータを送るアプリをやっています。私はそれを行うためにソケットを使用しています。サーバーがオンラインの場合は機能しますが、間違ったIP /ポートで接続しようとしたり、サーバーが実行されていなかったりすると、アプリケーションがフリーズし、何もできなくなります。これは、携帯電話のクライアントがサーバーに接続しようとするためです。

私が作るメインクラスがあります:

Thread cThread = new Thread( new TCPClient( ip, port, message, context) );
cThread.start();

メッセージが送信されたとき、またはエラーが表示されたときにToastを作成する必要があるため、新しいTCPClientにコンテキストがあります。TCPClientクラスには次のものがあります。

public void run(){
try {
InetAddress serverAddr = InetAddress.getByName(s_ip);
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, s_port); 

サーバーがオンラインの場合、次のようになります。

Log.d("TCP", "C: Sending: '" + s_msg + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(s_msg);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");

しかし、サーバーがオフラインであるか、間違ったIP /ポートを設定すると、アプリケーションがフリーズします。しばらく何もできません。

しばらくしてからサーバーへの接続の試行を強制的に停止する解決策はありますか?たとえば、5秒後にアプリケーションがキャッチし、エラーが発生します。

AsyncTaskでこれを行おうとすると、クライアントがサーバーに接続しようとしてもアプリケーションは動作しますが、許容できない時間の後にエラーのあるトーストが表示されるので、クライアントがサーバーに接続できないときにエラーが発生するソリューションが必要ですたとえば5秒で。

4

2 に答える 2

6

接続タイムアウトを設定できます。Socketクラスの異なるコンストラクターを使用する必要があります。インシード:

Socket socket = new Socket(serverAddr, s_port); 

使用する:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(serverAddr, s_port), 5000);

タイムアウトの場合、例外がスローされます。

于 2012-12-26T00:44:57.060 に答える
1

おそらく、設定しなかったtimeout connectionので0、デフォルトでは「」になります。これは、タイムアウトしないことを意味します。したがって、タイムアウトを1分に設定すると、1分以上フリーズしません。

于 2012-12-26T00:40:31.673 に答える