實測: 紅米4(android 6.0.1) 紅米Note5A(android 7.1.2) 測試完美運行。php
實現了兩臺Android設備在同一局域網內經過UDP進行實時的聊天通訊。實測支持顏文字,emoji。html
操做簡單,輸入須要鏈接的對方的ip地址,便可立刻通信。java
輸入對方的IP地址 android
聊天界面 正則表達式
支持滑動查看多條聊天記錄 網絡
首先要寫好聊天界面的代碼app
聊天界面只要是簡單模仿常規聊天應用的界面socket
上方是一個TextView承載顯示全部聊天內容,下方是內容輸入框還有發送按鈕。工具
如圖: post
代碼:
<?xml version="1.0" encoding="utf-8"?>
<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>
複製代碼
使用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();
}
}
複製代碼
public void disconnect(){
socket.close();
socket.disconnect();
}
複製代碼
<!-- 容許應用程序改變網絡狀態 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 容許應用程序改變WIFI鏈接狀態 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 容許應用程序訪問有關的網絡信息 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 容許應用程序訪問WIFI網卡的網絡信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 容許應用程序徹底使用網絡 -->
<uses-permission android:name="android.permission.INTERNET" />
複製代碼
android:windowSoftInputMode="stateHidden|stateAlwaysHidden|stateUnspecified|adjustPan"
複製代碼
使用正則表達式判斷用戶輸入的IP地址的合法性