实测: 红米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地址的合法性