2010-12-29 10 views
0

TCPIP経由でサーバに接続する必要があります。私はこれを行う方法を見つけましたが、例は永続的な接続をしません。単にデータを送信して接続を切断します。いくつかのパッケージを前後に渡すために接続を開いたままにする必要があります。Android JavaソケットソケットTCPIPオープン接続

たとえば、私は接続を要求してから、着信データを受信するプロセスを使用しています。このように:

  1. 接続
  2. #3
  3. に戻って...
  4. がデータを受信データを送信し、接続
  5. アクノリッジ接続を閉じます。

これ以上のサンプルコードは何もありますか?

答えて

0

私は別の用途で同様のアプリケーションを作成しましたが、サーバー側では聞き取りがなく、送信するだけでした。しかし、それはループ内で開いたままであり、特定のメッセージを受信すると、whileループでstrstrコマンドを使用してループと接続を閉じるように変更できます。コードのGarbage data transmitted in WiFi TCP connection from desktop to Android、および行を変更:このトピックを参照してください

n = write(newsockfd, string, sizeof(string)); 

n = write(newsockfd, string, strlen(string)); 

に私が持っていた問題を修正するために。

+0

トラフィックがなくなると一定期間後にバックグラウンドを停止するようにタイマーを設定することができました。 –

+0

これは最善の解決策であるようです。助けてくれてありがとう! –

0

"Apache MINA"や "Netty"のような上位レベルのライブラリを選択する必要がありますか?

+0

私はMINAを見つけましたが、TCPIPクライアントのために拡張するための簡単な例はありません。今まで私はNettyで多くを見つけることができなかった。 –

+0

最終的に見つかったNettyは、正しい方法を探していなかった。私はちょうどこんにちは、ああ、さようなら、接続上のいくつかのステップが必要なので、私は低レベルのものに固執すると思います。ありがとう! –

4

今から(ICS +)、ネットワーク接続を行うには、制限を解除したくない場合(非推奨!)、AsyncTask(またはハンドラ)を使用する必要があります。ネットワーク接続は、デフォルトでは主な活動スレッドから制限されています。

このAsyncTaskはトリックです(反対側には私はC++ソケットサーバーを持っていました)。この場合、私はソケットを開き、メインアクティビティから受け取った文字列を送信し、応答を受け取り、別のメッセージ(今回は "こんにちは")を送信し、接続を閉じる前に最後のメッセージを受け取ります。 (トライキャッチ以内)を使用して

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import android.os.AsyncTask; 
import android.util.Log; 

public class SocketConnect extends AsyncTask <String, Integer, String> { 

    String TAG = "TGsocket"; 

    @Override 
    protected String doInBackground(String... params) { 
     String url = params[0]; 
     String textSend = params[1]; 
     Log.i(TAG, "textsend = |" + textSend + "|"); 
     Socket socket = null; 
     DataOutputStream dataOutputStream = null; 
     DataInputStream dataInputStream = null; 
     try { 
      socket = new Socket(url, 9090); 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
      dataInputStream = new DataInputStream(socket.getInputStream()); 
      Log.i(TAG,"socket OK"); 
      dataOutputStream.writeUTF(textSend); 
      String textInNow = dataInputStream.readLine(); 
      Log.w(TAG, "says Server = " + textInNow); 
      dataOutputStream.writeUTF("hello there"); 
      textInNow = dataInputStream.readLine(); 
      Log.w(TAG, "says 2ndTime Server = " + textInNow); 
     } catch (UnknownHostException e) { 
      Log.e(TAG, "at thread unknownHost " + e.getMessage()); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e(TAG, "at thread IO " + e.getMessage()); 
      e.printStackTrace(); 
     } 

     finally{ 
      Log.i(TAG, "finally"); 
      if (dataOutputStream != null){ 
       try { 
        dataOutputStream.close(); 
       } catch (IOException e) { 
        Log.e(TAG, "at thread dataoutput IO " + e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 

      if (dataInputStream != null){ 
       try { 
        dataInputStream.close(); 
       } catch (IOException e) { 
        Log.e(TAG, "at thread datainput IO " + e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 
      if (socket != null){ 
       try { 
        Log.i(TAG, "socket closed"); 
        socket.close(); 
       } catch (IOException e) { 
        Log.e(TAG, "at thread finally IO " + e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      //displayProgressBar("Downloading..."); 
     } 
    @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
      //updateProgressBar(values[0]); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
     } 
} 

コール:

SocketConnect("100.100.100.100","some string"); 

"100.100.100.100" は、サーバーのIPです。

注:マニフェストファイルのインターネット使用のアクセス許可を設定することを忘れないでください。 注2:Logコールとほとんどのチェックと、3つの最終的なオーバーライドを安全に除去できますすべてがそこにあるので、それは簡単になります、場合によっては、上に構築する)。

は、froyo、gingerbread、icsおよびjbでテストされています。

関連する問題