Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端
Posted 童政通
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端相关的知识,希望对你有一定的参考价值。
android Socket UDP 包含发送端和接收端( 两种切换方式,点对点,或者广播通讯)
不想看博客的,请直接移步下载Demo
不想看博客的,请直接移步下载Demo
不想看博客的,请直接移步下载Demo
AndroidSocketUDP通讯手机对手机或者手机对PC端,点对点,或者广播通讯发送端和接收端-Android文档类资源-CSDN下载
Android中接受和发送都是需要在子线程中开启的,然后在回主线程更新UI效果,所以这里使用的是ThreadManager管理工具类管理 或者自己开启线程都一样,记得在主线程更新UI就好,
package com.example.mydemo;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.mydemo.bean.BroadCastDataBean;
import com.example.mydemo.bean.SocketDataBean;
import com.example.mydemo.utils.CalculateUtils;
import com.example.mydemo.utils.DeviceIdUtil;
import com.example.mydemo.utils.LogUtils;
import com.example.mydemo.utils.MD5ChangeUtil;
import com.example.mydemo.utils.ThreadManager;
import com.google.gson.Gson;
import com.lzh.easythread.AsyncCallback;
import com.lzh.easythread.EasyThread;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.concurrent.Callable;
/**
* 服务端界面
* 这里使用EasyThread线程池管理 效率大大滴
* 有接收线程--接收数据---固定核心线程(FixedThreadPool )
* 有发送线程--回写数据---缓存线程(CachedThreadPool )
*/
public class ServerActivity extends AppCompatActivity
private static final String TAG = "MainActivity";
private static String CurrentIP;
private static int BROADCAST_PORT = 7006;
private static int SEND_PORT = 7005;
private static int RECEIVE_PORT = 7003;
// private static String SEND_IP = "192.168.64.13";
private static String SEND_IP = "255.255.255.255";
// private static String BROADCAST_IP = "192.168.64.13";
private InetAddress inetAddress = null;
private DatagramSocket mSendSocket = null;
private DatagramSocket mReceiveSocket = null;
private volatile boolean isRuning = true;
private EditText mSendContent;
private Button mSend;
private Button mClear;
private TextView mReceive;
private TextView mMyIp;
private String sendStringData;
private Runnable mSendRunnable;
private EasyThread easyCacheThread;
private Runnable mReceiveRunnable;
private EasyThread easyFixed2Thread;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main02);
easyCacheThread = ThreadManager.getCache();
easyFixed2Thread = ThreadManager.getIO();
initView();
try
inetAddress = InetAddress.getByName(SEND_IP);
catch (Exception e)
e.printStackTrace();
initTask();
private void initTask()
//接收端-异步回调任务
startAsyncReceive();
//普通的Runnable任务,更新UI需要在主线程
//发送端:方式二点对点
//easyFixed2Thread.execute(getReceiveRunnable());
//easyCacheThread.execute(getSendRunnable(mSendContent.getText().toString().trim()));
//发送端:方式一:发送广播
easyCacheThread.execute(getSendBroadcastRunnable(mSendContent.getText().toString().trim()));
private void startAsyncReceive()
// 异步执行任务
Callable<SocketDataBean> callable = new Callable<SocketDataBean>()
@Override
public SocketDataBean call() throws Exception
// do something
LogUtils.e("正在执行Runnable任务:%s" + Thread.currentThread().getName());
byte[] receiveData = new byte[1024];
DatagramPacket mReceivePacket = new DatagramPacket(receiveData, receiveData.length);
try
mReceiveSocket = new DatagramSocket(BROADCAST_PORT);
catch (Exception e)
e.printStackTrace();
while (true)
if (isRuning)
try
LogUtils.e("======ReceiveThread=====000==");
mReceiveSocket.receive(mReceivePacket);
LogUtils.e("======ReceiveThread=====111==");
String rec = CalculateUtils.byteArrayToHexString(mReceivePacket.getData()).trim();
int dd = rec.indexOf("DD");
String recIp = rec.substring(0, dd + 2);
LogUtils.e("======ReceiveThread=====222==" + recIp);
if (mReceivePacket != null)
// Message revMessage = Message.obtain();
// revMessage.what = 1;
// revMessage.obj = recIp;
SocketDataBean socketDataBean = new SocketDataBean();
socketDataBean.setData("" + recIp);
Log.i(TAG, "handleMessage: ReceiveThread receive ip" + recIp);
return socketDataBean;
// for (int i = 0; i < 500000; i++)
// int finalI = i;
// runOnUiThread(new Runnable()
// @Override
// public void run()
// mReceive.setText(recIp + "===" + finalI);
//
// );
//
catch (IOException e)
e.printStackTrace();
;
// 异步回调
AsyncCallback<SocketDataBean> async = new AsyncCallback<SocketDataBean>()
@Override
public void onSuccess(SocketDataBean user)
// notify success;
LogUtils.e("======ReceiveThread=====onSuccess==" + user.getData());
for (int i = 0; i < 500; i++)
mReceive.setText(user.getData() + "===" + i);
@Override
public void onFailed(Throwable t)
// notify failed.
LogUtils.e("======ReceiveThread=====onFailed==");
;
// 启动异步任务
easyFixed2Thread.async(callable, async);
private Runnable getReceiveRunnable()
mReceiveRunnable = new Runnable()
@Override
public void run()
LogUtils.e("正在执行Runnable任务:%s" + Thread.currentThread().getName());
byte[] receiveData = new byte[1024];
DatagramPacket mReceivePacket = new DatagramPacket(receiveData, receiveData.length);
try
mReceiveSocket = new DatagramSocket(RECEIVE_PORT);
catch (Exception e)
e.printStackTrace();
while (true)
if (isRuning)
try
LogUtils.e("======ReceiveThread=====000==");
mReceiveSocket.receive(mReceivePacket);
LogUtils.e("======ReceiveThread=====111==");
String rec = CalculateUtils.byteArrayToHexString(mReceivePacket.getData()).trim();
int dd = rec.indexOf("DD");
String recIp = rec.substring(0, dd + 2);
LogUtils.e("======ReceiveThread=====222==" + recIp);
if (mReceivePacket != null)
// Message revMessage = Message.obtain();
// revMessage.what = 1;
// revMessage.obj = recIp;
for (int i = 0; i < 500000; i++)
int finalI = i;
runOnUiThread(new Runnable()
@Override
public void run()
mReceive.setText(recIp + "===" + finalI);
);
Log.i(TAG, "handleMessage: ReceiveThread receive ip" + recIp);
catch (IOException e)
e.printStackTrace();
;
return mReceiveRunnable;
//
private Runnable getSendBroadcastRunnable(String data)
mSendRunnable = new Runnable()
@Override
public void run()
try
byte[] sendData = getSendData(data);
// byte[] sendData = data.getBytes();
DatagramPacket mSendPacket = new DatagramPacket(sendData, sendData.length, inetAddress, BROADCAST_PORT);
for (int i = 0; i < 2; i++)
mSendSocket = new DatagramSocket();
mSendSocket.send(mSendPacket);
mSendSocket.setBroadcast(true);
mSendSocket.close();
catch (Exception e)
;
return mSendRunnable;
// private Runnable getSendRunnable(String data)
//
// mSendRunnable = new Runnable()
// @Override
// public void run()
// try
// byte[] sendData = getSendData(data);
// DatagramPacket mSendPacket = new DatagramPacket(sendData, sendData.length, inetAddress, SEND_PORT);
// for (int i = 0; i < 2; i++)
// mSendSocket = new DatagramSocket();
// mSendSocket.send(mSendPacket);
// mSendSocket.close();
//
// catch (Exception e)
//
//
//
// ;
// return mSendRunnable;
//
private void initView()
mSendContent = findViewById(R.id.et_sendContent);
mSend = findViewById(R.id.btn_sendInfo);
mClear = findViewById(R.id.btnClear);
mReceive = findViewById(R.id.tv_receive);
mMyIp = findViewById(R.id.ip_info);
//Wifi状态判断
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled())
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
CurrentIP = getIpString(wifiInfo.getIpAddress());
mMyIp.append(CurrentIP);
LogUtils.e("mMyIp====:" + CurrentIP);
mSend.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
easyCacheThread.execute(getSendBroadcastRunnable(mSendContent.getText().toString().trim()));
);
mClear.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
mReceive.setText("");
);
@Override
protected void onDestroy()
super.onDestroy();
isRuning = false;
mReceiveSocket.close();
LogUtils.e("UDP Server程序退出,关掉mReceiveSocket,接收消息");
finish();
/**
* 将获取到的int型ip转成string类型
*/
private String getIpString(int i)
return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "."
+ ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF);
private byte[] getSendData(String trim)
LogUtils.e("TAG==输入光源数值=trim===" + trim);
String letterAndNumber = "1234abcdABCD56789";
// CharMatcher.javaDigit().matches('1');
//非空等等校验
if ("".equals(trim))
trim = "50";
int iData = Integer.parseInt(trim);
if (iData <= 0)
iData = 0;
else if (iData >= 63)
iData = 63;
String inputSumLightData = CalculateUtils.numToHex8(iData);
// aa c5 00 -00 08 00 00 01 21-- 15 --97 dd
String str = "aac5000008000001211597dd"; //该亮度 21
/**
* 计算异或校验值
* 先截取需要做校验的字符串,再计算校验值
*/
//AA+截取数据命令+输入光源16进制 之后再做异或校验值
LogUtils.e("TAG==输入光源数值==16进制==" + inputSumLightData); //15
LogUtils.e("TAG==输入光源数值==截取==" + str.substring(6, str.length() - 6));//000800000121
String checkData = "AA" + str.substring(6, str.length() - 6);
LogUtils.e("TAG==截取的长度=" + checkData); //AA000800000121
LogUtils.e("TAG==需要计算异或的数据=" + checkData + inputSumLightData); //AA00080000012115
String hexXORData = CalculateUtils.get16HexXORData(checkData + inputSumLightData);
LogUtils.e("TAG==发送的异或结果=" + hexXORData);
//AA+截取数据命令+输入光源16进制 之后再做异或校验值+DD结尾
sendStringData = str.substring(0, str.length() - 6) + inputSumLightData + hexXORData + "dd";
LogUtils.e("TAG==发送的结果=" + sendStringData);
//16进制String转换成byte字节数组
byte[] bytes = CalculateUtils.hexString2Bytes(sendStringData);
return bytes;
下面是上面使用到的工具类:略~~可以下载具体Demo 里面全部有,还有PC端调试工具
以上是关于Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端的主要内容,如果未能解决你的问题,请参考以下文章
Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端
Socket网络编程学习笔记 UDP辅助TCP实现点对点传输案例 -- UDP广播搜索获取IP/Port