AndroidはUDPベースのLANチャット通信(完全なDemoあり)

12948 ワード

最初は、完全に実行されているDemoのダウンロードアドレスを直接示します.http://www.demodashi.com/demo/12057.html急用の皆さんに便利です.
1.開発環境
1.1開発ツール
  • IDE:AndroidStudio 2.3
  • 言語:java
  • jdk1.8
  • 最低サポート:Android 4.1以上
  • 1.2試験環境
  • 実測:赤米4(android 6.0.1)赤米Note 5 A(android 7.1.2)テストは完璧に実行された.
  • は、2台のAndroidデバイスが同じローカルエリアネットワーク内でUDPを介してリアルタイムのチャット通信を行うことを実現した.実測は顔文字、emojiをサポートします.
  • は操作が簡単で、接続する必要がある相手のipアドレスを入力すると、すぐに通信できます.

  • 2.プレゼンテーションの効果
  • 相手のIPアドレスAndroid基于UDP的局域网聊天通信(有完整Demo)_第1张图片
  • を入力.
  • チャットインターフェイスAndroid基于UDP的局域网聊天通信(有完整Demo)_第2张图片
  • は、複数のチャットレコードAndroid基于UDP的局域网聊天通信(有完整Demo)_第3张图片
  • をスライド表示することをサポートする.
    3.コード実装プロセス
    3.1インタフェースコード
    まずチャットのインタフェースのコードを書きます
  • チャットインターフェースは、主に従来のチャットアプリケーションを簡単に模倣するインターフェース
  • である.
  • の上にはTextViewベアラがすべてのチャットコンテンツを表示し、下にはコンテンツ入力ボックスと送信ボタンがあります.
  • 図:Android基于UDP的局域网聊天通信(有完整Demo)_第4张图片
  • コード:
  • 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="20dp"
        android:paddingBottom="10dp">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="8.5"
            android:background="@drawable/shape_background_content"
            android:orientation="vertical"
            android:padding="5dp">
            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/scrollView">
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_receive_content"
                    android:textSize="18sp"
                    android:textColor="#36b722"/>
            ScrollView>
        LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:orientation="horizontal"
            android:layout_weight="1">
            <EditText
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="8"
                android:layout_gravity="center"
                android:id="@+id/et_send_content"
                android:background="@drawable/shape_background_et"
                android:layout_marginRight="5dp" />
    
            <Button
                android:layout_width="0dp"
                android:layout_weight="1.5"
                android:layout_height="wrap_content"
                android:text="  "
                android:layout_gravity="center"
                android:id="@+id/btn_send"
                android:background="@drawable/selector_button"/>
        LinearLayout>
    LinearLayout>
    
  • 注意:インタフェースを美しくするために、ボタンと上のチャット記録表示領域のbackgroundを設定し、フィレットバンドエッジのshapeを書いて実現し、demoコードをダウンロードして表示しました.

  • 3.2 javaロジック実装
    3.2.1 UDPベースのSocket通信
    DatagramSocketによるUDPベースのSocket通信
  • 送信データ:
  • public void sendDataWithUDPSocket(String str) {
            try {
                InetAddress serverAddress = InetAddress.getByName(ipAddr);
                byte data[] = str.getBytes();
                DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,10025);
                socket.send(packet);
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    受信データ:
     public void ServerReceviedByUdp(){
            DatagramSocket socket;
            try {
                socket = new DatagramSocket(10025);
                while (true){
                    byte data[] = new byte[4*1024];
                    DatagramPacket packet = new DatagramPacket(data,data.length);
                    socket.receive(packet);
                    String result = new String(packet.getData(),packet.getOffset() ,packet.getLength());
                    if(!TextUtils.isEmpty(result)){
                        WordsEvent wordsEvent=new WordsEvent(result);
                        EventBus.getDefault().post(wordsEvent);
    
                    }
                    System.out.println("     :"+result);
                }
    
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
  • Socket
  • を閉じる
     public void disconnect(){
            socket.close();
            socket.disconnect();
        }

    3.2.2 Manifestsインベントリファイル
  • ネットワーク関連の権限宣言:
  • 
        
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    
        
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    
        
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
        
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
        
        <uses-permission android:name="android.permission.INTERNET" />
  • *activity以下の属性を加えると、ソフトキーボードのイジェクト時のインタフェースの圧縮とブロック提案内容入力ボックス*
  • を避けることができます.
    android:windowSoftInputMode="stateHidden|stateAlwaysHidden|stateUnspecified|adjustPan"

    3.2.3 IPアドレスの正当性判断
    正規表現を用いてユーザが入力したIPアドレスの正当性を判断する
  • はjava APIのPatern,Matcherなどのクラスを利用して正規表現で実現する.
  • 具体的にdemoをダウンロードしてソースコードを見ます.

  • 4.Demoダウンロード
    実測完璧運行のDemoダウンロードアドレス:http://www.demodashi.com/demo/12057.html