日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android udp定时发送,Android Socket基于UDP协议通信

發布時間:2025/3/21 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android udp定时发送,Android Socket基于UDP协议通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我們要知道UDP通信協議是Socket通信的一種實現方式,Socket通信一般有兩種通信方式:基于TCP協議、基于UDP協議。這兩者的差別和優缺點就不說了,這里主要講一下基于UDP協議的實現。

基本原理

基于UDP的通信都是通過java.net.DatagramSocket這個類來實現的,我們常用的有connect()、disConnect()、send()、receive()幾個方法。通過方法名我們可以輕易區分出用法。另一個需要知道的就是DatagramPacket類,如果把DatagramSocket比作管道的話,DatagramPacket就是管道中運輸的物品,也就是說,它就是數據的載體。

DatagramSocket:

public DatagramSocket()throws SocketException {

this(0);

}

public DatagramSocket(int aPort)throws SocketException {

checkPort(aPort);

createSocket(aPort, Inet4Address.ANY);

}

public DatagramSocket(int aPort, InetAddress addr)throws SocketException {

checkPort(aPort);

createSocket(aPort, (addr == null) ? Inet4Address.ANY : addr);

}

三個構造方法,我們可以指定端口和IP,也可以不指定,在發送數據的時候,在數據包中指定。

DatagramPacket:

public DatagramPacket(byte[]data, int length) {…}

public DatagramPacket(byte[]data, int offset, int length) {…}

public DatagramPacket(byte[]data, int offset, int length, InetAddress host, int aPort) {…}

public DatagramPacket(byte[]data, int length, InetAddress host, int port) {…}

so 我們可以看到可以在數據包中設置ip和端口,所以如果連接時不指定也是可以的。

基本操作

1、connect new出一個DatagramSocket對象,設置端口和IP,connect();

2、send 創建一個DatagramPacket對象,socket.send(packet)發送數據;

3、receive 創建一個DatagramPacket對象,socket.receive(package)接收數據;

創建一個連接

使用connect方法創建一個Socket連接

public void connect() {

if (mSocket == null || mSocket.isClosed()) {

try {

//獲取連接 ip:192.168.1.3 port:11069

InetAddress address = InetAddress.getByName(Command.udp_address);

mSocket = new DatagramSocket();

mSocket.connect(address, Command.udp_port);

messageQueue = new ArrayList < String > ();

//開啟接收線程

mReceiveThread = new ReceiveThread();

mReceiveThread.start();

} catch (SocketException e) {

e.printStackTrace();

}

}

}

定時發送數據保持通信

要保持通信的話,肯定要用到線程了,定時發送數據的話,可以用Handler,或者也可以使用AlarmManager。這里使用Handler實現就好了。

寫的時候看了一堆博客,發送的時候都是new 出一個Thread進行發送數據,發送之后寫接收數據的代碼,而且沒有進行回收或者怎樣,只能最后通過GC回收,當然大體上看是沒毛病的,但是其實有很大的問題!因為我項目要求收到服務器的應答之后做一些相應的操作,,然后,然后,,因為每一個線程都在等待著接收數據,所以服務端回復一條數據之后,這邊每個線程都作出了回應(回復服務器一條不一樣的數據),10s創建一個線程發送數據,服務器過了一段時間再回復,然后就瞬間爆炸!

所以,,接收和發送應該是要分開的,不能阻塞在同一個線程中。一開始想到Handler的原理和機制,想模仿它死循環從一個隊列中取數據,如果有數據就發送,想法是沒毛病,也能發送,但是當我想在發送成功之后從列表中remove掉這條數據之后就不行了,線程阻塞了。具體原因應該是造成死鎖了,因為數據列表是定義在主線程,然后一直在被工作線程占用著,獲取不到對象進行remove操作,等待一定時間后,直接crash掉了(我的分析是這樣的)。

ok,那就寫兩個線程好了,一個SendThread,一個ReceiveThread,另外通過Handler控制10s定時發送。

發送線程:

public class SendThread extends Thread {

@ Override

public void run() {

super.run();

try {

if (mSocket == null || mSocket.isClosed())

return;

if (messageQueue.size() < 1)

return;

//發送

final String data = messageQueue.get(0);

byte[]datas = data.getBytes();

InetAddress address = InetAddress.getByName(Command.udp_address);

final DatagramPacket packet = new DatagramPacket(datas, datas.length, address, Command.udp_port);

mSocket.send(packet);

Logs.e("ConnectManager", "send success data is:" + data);

messageQueue.remove(0);

} catch (UnknownHostException e) {

e.printStackTrace();

}

catch (IOException e) {

e.printStackTrace();

}

}

}

接收線程:

private class ReceiveThread extends Thread {

@ Override

public void run() {

super.run();

if (mSocket == null || mSocket.isClosed())

return;

try {

byte datas[] = new byte[512];

DatagramPacket packet = new DatagramPacket(datas, datas.length, address, Command.udp_port);

mSocket.receive(packet);

String receiveMsg = new String(packet.getData()).trim();

Logs.e("ConnectManager", "receive msg data is:" + receiveMsg);

mHandler.sendEmptyMessage(2);

} catch (IOException e) {

e.printStackTrace();

}

}

}

我們可以看到ReceiveThread中只接收了一次數據,那如何實現一直保持通信?接收消息?Handler!接收到消息之后我們通過Handler發送了一條消息,這條消息干嘛的呢,重啟這個線程,也就是讓它繼續接收數據。 這樣的話,就保證了只有一個線程在接收數據。

private Handler mHandler = new Handler() {

@ Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 2) {

mReceiveThread.interrupt();

mReceiveThread = null;

mReceiveThread = new ReceiveThread();

mReceiveThread.start();

}

}

};

同樣,定時發送數據也是通過Handler實現的,每10s發送一個消息,讓socket發送一個數據包,并且給自己發送一個10s后發送的同樣的消息,反正就是自己控幾自己啦。

發送消息:

public void sendPackageRegister() {

String content = "(1001," + Command.deviceId + ",register)";

messageQueue.add(content);

mSendThread.interrupt();

mSendThread = null;

mSendThread = new SendThread();

mSendThread.start();

}

最后,記得停掉Handler一直發送數據,停掉線程。

總結

以上是生活随笔為你收集整理的android udp定时发送,Android Socket基于UDP协议通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人一级片在线观看 | 久久亚洲影视 | 插插看 | 亚洲第一成人av | 午夜淫片 | 老外黄色一级片 | 亚洲欧洲国产综合 | 色屁屁 | 91伊人网 | 亚洲特黄一级片 | 成年人看的羞羞网站 | 日日草视频 | 老头吃奶性行交 | 成人精品免费 | 亚洲一卡二卡在线 | 日韩色黄大片 | 色爽爽一区二区三区 | 臭脚猛1s民工调教奴粗口视频 | 女同性αv亚洲女同志 | 亚洲天堂视频网站 | 免费日韩欧美 | 特大黑人娇小亚洲女mp4 | 手机福利在线 | 日韩精品高清视频 | 国产视频精品久久 | 日韩一区二区三免费高清在线观看 | 国产美女自拍 | 国产a级片免费看 | 婷婷射图| 久久久久久久亚洲 | 黄色一级大片在线免费看国产 | 麻豆理论片 | c逼视频 | 国产农村妇女精品 | 神马午夜888 | 狼人av在线 | 欧美激情在线狂野欧美精品 | 伊人999 | 免费看a视频 | 一级v片 | 国产福利二区 | www.国产精品视频 | 国产亚洲一区二区三区在线观看 | 日韩欧美精品中文字幕 | 青青草网址 | 成人黄色三级视频 | jizz俄罗斯| 午夜免费片 | 国产精品毛片一区二区三区 | 男生女生插插插 | 美女污污网站 | 国产福利免费 | 国产经典久久 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 91偷拍精品一区二区三区 | 日韩一级特黄 | 欧美特一级 | 中国免费毛片 | 久久久涩 | 亚洲av人人澡人人爽人人夜夜 | 国产精品美女久久久免费 | 亚洲国产精品免费 | 免费在线观看黄色片 | 国产日产精品一区 | 日本在线视频一区二区三区 | 日本毛片视频 | 午夜性激情| 国产欧美另类 | av免费播放网站 | 精品人妻一区二区色欲产成人 | 亚洲成av人在线观看 | 日韩电影在线观看一区 | 欧美日韩国产一区二区在线观看 | 国产老熟妇精品观看 | 少妇献身老头系列 | 少妇一级淫免费放 | 97射射| 95久久| 日韩在线观看视频一区 | 亚洲精品乱码久久久久久蜜桃麻豆 | 免费在线观看av的网站 | 国产66页 | 99小视频 | 三级自拍视频 | 中国美女一级看片 | 国产免费又黄又爽又色毛 | www免费网站在线观看 | 国产精选网站 | 亚洲一区电影网 | 激情www | 日韩天堂一区 | 国产成人午夜精华液 | 日韩av大片 | 他趴在我两腿中间添得好爽在线看 | 天堂色av | 欧美性一级片 | 九一亚洲精品 | 亚洲一区第一页 | 久久久久久久久久艹 |