Android TCPソケット通信クライアント/サーバーデモ(APPソースコード付き)

この記事では、主にAndroid TCPソケット通信クライアント(クライアント)およびサーバー(サーバー)デモ(ソースコード付き)の実装について説明します。BufferedReaderのreadLine()メソッドに注意してください[((line = br.readLine())!= null)]ブロッキングの問題、およびドッキングハードウェアのプロジェクトデータの16進数の&& byte && intでの変換処理。

タイハン

最近、TCPソケット通信を使用する必要があり、大きな落とし穴に遭遇したプロジェクトがあったので、このデモを作成しました。
ソケット入力ストリームを読み取る場合、多くのコードがこのように記述され、通常は問題ありませんが、readLine()メソッドは、改行とキャリッジリターンを読み取れない場合にブロックします。
String line = null;
while((line = br.readLine())!= null){
}
readLine()はブロッキング関数ですが、改行またはキャリッジリターン( ' \ n '、' \ r 'は16進数に対応します0D0A)が返され、一部のモジュールはこれら2つのターミネータなしでデータを返すため、ブロッキングが発生し、プログラムを続行できません。この場合、モジュール側がターミネータを変更して追加することをいとわないのであれば、問題はありません。モジュールの変更が不便な場合、この方法は使用できず、書き込み方法を変更する必要があります。

デバッグツール

リアルタイムのデバッグには、TCPデバッグアシスタントやTCPテストツールなどのPC側のツールを使用できます。ユーザーが多く、操作もばかげています。IPとポートを入力してから、確立または接続します。 。
ここに画像の説明を挿入します
Android TCPソケット通信クライアント/サーバーデモ(APPソースコード付き)

デモのデモンストレーションと実装

ナンセンスな話をやめて、今日のトピックに直接進んでください。AndroidでTCP / IPプロトコルを使用して、Socketを使用してサーバーと通信する方法を見てみましょう。
ここに画像の説明を挿入します

1.許可

 <uses-permission android:name="android.permission.INTERNET"/>

第二に、サーバーの実装は、簡単に言えば、3つのステップが必要です

1. ServerSocketを作成し、ポートを監視して、クライアントSocketが接続するのを待ちます。2。Socketから
クライアントからメッセージを取得します
。3。Socketを介してクライアントにメッセージ送信します

コアコードは次のとおりです

class ServerSocketThread extends Thread {

    @Override
    public void run() {
        try {  
           // 创建ServerSocket  
           ServerSocket serverSocket = new ServerSocket(9999);  
           System.out.println("--开启服务器,监听端口 9999--");  

           // 监听端口,等待客户端连接  
           while (true) {  
               System.out.println("--等待客户端连接--");  
               Socket socket = serverSocket.accept(); //等待客户端连接  
               System.out.println("得到客户端连接:" + socket);  

               startReader(socket);  
           }  

       } catch (IOException e) {  
           e.printStackTrace();  
       } 
    }
}

   /**  
    * 从参数的Socket里获取消息 
    */  
   private static void startReader(final Socket mSocket) {  
       new Thread(){  
           @Override  
           public void run() {  
               try {  
                   // 获取读取流  
                   BufferedReader in = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),"utf-8"))
                   String line="";
                   while ((line = in.readLine()) != null) {// 读取数据  
                       System.out.println("*等待客户端输入*");  
                       System.out.println("获取到客户端的信息:" + line);
                    }
               } catch (IOException e) {  
                   e.printStackTrace();  
               }  
           }  
       }.start();  
   } 

 //通过socket来给客户端发送消息
 private void serverSendMessage(String mServerSendMessage) {
     new Thread() {
         @Override
         public void run() {
             PrintWriter out;
             try {
                 out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())), true);
                 out.println(mServerSendMessage);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }.start();
  }

サーバー側のプロセスと同様の3つのクライアント側の実装

1.サーバーとのソケット接続を確立します
2.入力ストリームと出力ストリームを取得します
3.メッセージを受信/送信します

//与服务器建立连接
Socket mClientSocket = new Socket(mClientIp, mClientPort);

//从socket获取输入输出流
BufferedReader mClientIn = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
PrintWriter mClientOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mClientSocket.getOutputStream())), true);

//监听服务端下发的消息
String clientReceiverMessage;
if ((clientReceiverMessage = mClientIn.readLine()) != null) {
    if (mOnConnectListener != null) {
        mOnConnectListener.onMessage(clientReceiverMessage);
    }
} 

//给服务端发消息
mClientOut.println(mClientSendMessage);

コードパッケージリスナーインターフェイス

実際の開発プロセスでは、通常、ソケットをカプセル化してから、外部でリスナーインターフェイスを設定し、他のモジュールでビジネスロジックを処理します。また、複数のソケット接続と通信を処理する必要があるものもあります。

サーバー側のコード実装例

public class TcpServer {

    private static final String TAG = "TcpServer";

    private static TcpServer mTcpServer = new TcpServer();
    private OnListener mOnListener;
    private ServerSocketThread mServerSocketThread;

    public static TcpServer getInstance() {
        return mTcpServer;
    }

    public void setOnListener(OnListener onListener) {
        mOnListener = onListener;
    }

    public interface OnListener {
        void onStart();

        void onNewClient(String serverIp, String clientIp, int count);

        void onError(Throwable e, String message);

        void onMessage(String ip, String message);

        void onAutoReplyMessage(String ip, String message);

        void onClientDisConnect(String ip);

        void onConnectTimeOut(String ip);
    }

    public void setPort(int port) {
        mServerPort = port;
    }

    ………………………………
    ………………………………
    ………………………………
}

16進数の送受信処理

ドッキングハードウェアプロジェクトの通信プロトコルは16進数を使用する可能性があるため、データは文字列\ byte \ int 16進数に変換する必要がありますが、通信部分の本質は同じで、コードは次のとおりです。

  //十六进制 发送
  try {
      //byte[] msg = {(byte) 0xaa,(byte) 0xbb,(byte) 0x0d,(byte) 0x0a};
      byte[] msg = IntByteStringHexUtil.hexStrToByteArray("AABB0D0A");
      OutputStream socketWriter = socket.getOutputStream();

      socketWriter.write(msg);
  } catch (IOException e) {
      e.printStackTrace();
  }

  //十六进制 接收
  InputStream socketReader = socket.getInputStream();
  byte buf[] = new byte[1024];
  int len = socketReader.read(buf);

  byte data[] = new byte[len];
  System.arraycopy(buf, 0, data, 0, len);

  logClient(len+","+IntByteStringHexUtil.byteArrayToHexStr(data));

デモソースのダウンロードアドレス

ソースコードもCSDNに配置されており、必要に応じてCSDNから学ぶことができます。

===> AndroidTCPソケット通信の例デモソースコードAPKダウンロード

おすすめ

転載: blog.51cto.com/12521475/2658251