Android手機發送和監聽UDP資料
UDP協議中文名是使用者資料報協議,在網路中它與TCP協議一樣用於處理資料包,是一種無連線的協議。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。與所熟知的TCP(傳輸控制協議)協議一樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬於傳輸層協議。UDP協議的主要作用是將網路資料流量壓縮成資料包的形式。一個典型的資料包就是一個二進位制資料的傳輸單位。每一個數據包的前8個位元組用來包含報頭資訊,剩餘位元組則用來包含具體的傳輸資料。UDP資料包是面向無連線的,使用者發出資料包不需要得到確認,因此是是不可靠的傳輸。
Android的UDP的資料傳輸和JAVA裡沒有什麼區別。
UDP工具類:
package com.wifi.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
/**
* UDP工具類
* @author Sunward
*
*/
public class UDPUtils implements Runnable {
public boolean keepRunning = true;//執行緒開始標誌
public static final String TAG = "TEST";
//傳送目的主機IP和埠
private static String SERVER_IP;
private static int SERVER_PORT;
//本機監聽的埠
private static int LOCAL_PORT = 8929;
//傳送的訊息
private String message = "test";
//伺服器接收的訊息
private String receive;
//Handler傳遞的資料
private Message msg;
//Message傳遞的Buddle引數
private Bundle bundle;
//wifi名和密碼
private String SSID,password;
public UDPUtils(){
}
public UDPUtils(String Server_IP, int Server_Port) {
SERVER_IP = Server_IP;
SERVER_PORT = Server_Port;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
/**
* 執行緒停止標誌
* @param keepRunning
*/
public void setKeepRunning(boolean keepRunning) {
this.keepRunning = keepRunning;
}
public boolean getKeepRunning(){
return this.keepRunning;
}
/**
* 服務端監聽程式
*/
public void StartListen() {
keepRunning = getKeepRunning();
DatagramSocket socket = null;
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket = new DatagramSocket(LOCAL_PORT);
socket.setBroadcast(true);
Log.i(TAG, "socket");
// socket.setSoTimeout(200);
} catch(Exception e) {
e.printStackTrace();
return;
}
while (keepRunning) {
try {
//等待客戶機連線
packet.setData(data);
Log.e(TAG, "receive0");
socket.receive(packet);
receive = new String(packet.getData(), 0, packet.getLength());
msg = new Message();
bundle = new Bundle();
//把資料放到buddle中
bundle.putString("receive", receive);
//把buddle傳遞到message
msg.setData(bundle);
myHandler.sendMessage(msg);
} catch (Exception e) {
continue;
}
}
if (socket != null) {
socket.close();
socket = null;
}
}
//利用Handler將接收的資料實時打印出來
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
Bundle bundle=new Bundle();
//從傳過來的message資料中取出傳過來的繫結資料的bundle物件
bundle = msg.getData();
receive = bundle.getString("receive");
setMessage(receive);
}
};
public void sendControInfo(String message){
try {
DatagramSocket sendSocket = new DatagramSocket();
byte[] configInfo = message.getBytes();
InetAddress ip = InetAddress.getByName(SERVER_IP); //即目的IP
DatagramPacket sendPacket = new DatagramPacket(configInfo, configInfo.length, ip ,SERVER_PORT);// 建立傳送型別的資料報:
sendSocket.send(sendPacket); // 通過套接字傳送資料:
sendSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
StartListen();
}
}
MainActivity:
package com.wifi.main;
import java.lang.Thread.State;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.jushi_blub.R;
import com.wifi.udp.UDPUtils;
import com.wifi.utils.MyApplication;
public class MainActivity extends Activity implements OnClickListener{
public static final String TAG = "MainActivity";
private Button send_udp,receive_udp,coapServer,coapClient;
private long exitTime = 0;
//傳送或者接收的文字
public static EditText send_msg,receive_msg;
//目的主機IP
private String SERVER_IP;
private int SERVER_PORT;
//本機監聽埠
private int LOCAL_PORT;
private TextView infomation;
private UDPUtils udpUtils;
private String message;
private Thread thread;
private Map<String, Object> map;
//使用者輸入的燈泡ID
private int bulbID;
//用來儲存全域性變數,用於Activity之間的傳遞
private MyApplication myApplication;
//定時器,用來檢測是否接收到成功訊息
private Timer timer;
//燈泡的狀態
private String status = "off";
/**
* 初始化
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
myApplication = (MyApplication)this.getApplicationContext();
map = myApplication.getMap();
if (!map.isEmpty()) {
SERVER_IP = map.get("IP").toString();
SERVER_PORT = Integer.parseInt(map.get("Port").toString().trim());
LOCAL_PORT = Integer.parseInt(map.get("LOCAL_PORT").toString().trim());
}else {
SERVER_IP = "192.168.0.107";
SERVER_PORT = 9090;
LOCAL_PORT = 8929;
}
udpUtils = new UDPUtils(SERVER_IP,SERVER_PORT, LOCAL_PORT);
infomation.append("目的IP: "+SERVER_IP+"\n"+"目的埠: "+SERVER_PORT+"\n");
infomation.append("本地埠: " +LOCAL_PORT);
}
/**
* 控制元件初始化
*/
public void initViews(){
send_udp = (Button) findViewById(R.id.send_udp);
send_msg = (EditText) findViewById(R.id.message);
receive_msg = (EditText) findViewById(R.id.receive);
infomation =(TextView) findViewById(R.id.information);
send_udp.setOnClickListener(MainActivity.this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 監聽Back鍵按下事件,方法1:
* 注意:
* super.onBackPressed()會自動呼叫finish()方法,關閉
* 當前Activity.
*/
/* @Override
public void onBackPressed() {
super.onBackPressed();
} */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO 按兩次返回鍵退出應用程式
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
// 判斷間隔時間 大於2秒就退出應用
if ((System.currentTimeMillis() - exitTime) > 2000) {
// 應用名
String applicationName = getResources().getString(
R.string.app_name);
String msg = "再按一次返回鍵退出";
//String msg1 = "再按一次返回鍵回到桌面";
Toast.makeText(MainActivity.this, msg, 0).show();
// 計算兩次返回鍵按下的時間差
exitTime = System.currentTimeMillis();
} else {
// 關閉應用程式
finish();
// 返回桌面操作
// Intent home = new Intent(Intent.ACTION_MAIN);
// home.addCategory(Intent.CATEGORY_HOME);
// startActivity(home);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 選單單擊事件
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.wifi_config) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, WIFIActivity.class);
this.startActivity(intent);
return true;
}
if (id == R.id.ip_config) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, IPActivity.class);
this.startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.send_udp:
new Thread(){
@Override
public void run(){
udpUtils.sendControInfo("Hello");
}
}.start();
thread = new Thread(udpUtils);
thread.start();
break;
default:
break;
}
}
/**
* 判斷輸入的是否為數字
* @param str
* @return
*/
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判斷開燈返回的資料
* @param receive
* @return
*/
@Override
protected void onDestroy() {
super.onDestroy();
//關閉執行緒
udpUtils.setKeepRunning(false);
}
}
效果圖:
在同一個區域網下進行測試,目的主機是電腦IP地址是192.168.0.107,安裝了TCP/UDPb捕獲軟體,手機發送開關訊號電腦的軟體能夠接收到,並且電腦傳送訊息手機也能監聽到。這裡要注意:
1.手機的點選按鈕事件中的傳送資料一定要放線上程裡執行,否則會報主執行緒不能處理網路請求的相關異常。
2.監聽接收資料時,也要啟動一個執行緒,在UDPUtils中監聽資料的埠號不能和傳送的埠號相同,且接收資料需要放到Handler中處理,否則不能實時將資料列印在手機上。
相關推薦
Android手機發送和監聽UDP資料
UDP協議中文名是使用者資料報協議,在網路中它與TCP協議一樣用於處理資料包,是一種無連線的協議。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。與所熟知的TCP(傳輸控制協議)協議一樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考
Udp實現消息的發送和接收、以及圖片的上傳
cat 數據 art ram pan ket length out leo //Udp實現消息的發送和接收 import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagr
Android 設定軟鍵盤右下角鍵盤樣式和監聽右下角點選回撥
文章目錄 設定軟鍵盤右下角按鍵顯示樣式 監聽右下角點選回撥 設定軟鍵盤右下角按鍵顯示樣式 在EditText中使用android:imeOptions設定右下角顯示樣式(需要搭配 android
Android中GIF動圖的播放控制和監聽詳解
android下播放gif圖片功能似乎並不常用,很多時候還是以展示靜態圖片為主,可能是由於gif圖體積比較大吧。不過像表情動畫什麼的,可能還是需要gif圖的。本文主要給大家介紹了關於Android中GIF動圖的播放控制和監聽的相關資料,需要的朋友可以參考下。 前
android adb shell 模擬廣播發送和鍵值事件
1.模擬傳送廣播adb shell am broadcast -a 定義的廣播action string2.模擬上下左右 確定鍵值adb shell input keyevent "value"va
Android ViewPager+Handler實現無限輪播和監聽處理事件時輪播速度越來越快的問題解決
大家都知道android的無限輪播實現的方法有很多,我們先來看看ViewPager+Handler吧: 一.ViewPager+Handler實現無限輪播 點選下載原始碼 package com.demo.sb.main; import java.util.Arra
js對手機軟鍵盤的監聽
方法 如果 監聽 focus 事件代理 對手 http 移動端 cti js還沒有辦法對手機軟鍵盤直接進行監聽的,但是可以有其他角度來判斷軟鍵盤是否彈起。比如輸入框是否獲取焦點等。focusin和focusout支持冒泡,對應focus和blur, 使用focusin和fo
節點2上crsd無法啟動,數據庫和監聽無法自動啟動,比如ocrconfig、ocrcheck以及srvct
oracle 數據庫 操作系統 信息 手工 CRSD進程在11g中的變化在11.2中,CRSD進程不再是RAC中最關鍵的進程之一。如果對10g RAC比較熟悉,應該清楚CRSD進程的重要性,Oracle在操作系統啟動後,就是通過啟動這個進程然後啟動整個CLUSTER以及數據庫的。在11.2
郵件發送和接收限制
郵件服務器 郵件系統 收發郵件 連接器 影響 郵件發送和接收限制禁止大郵件的作用: 限制用戶發送和接收郵件大小,能夠避免因為提交體積過大的郵件導致郵件服務器負載急增,造成服務器的過載而影響整個郵件系統。此外,限制接收郵件的大小,更關鍵的作用是避免外部郵件系統惡意發送大體積郵件對郵
JavaScript之事件概念和監聽事件
scrip isp doctype utf itl 技術分享 創建 img ret 1、事件的概念: JavaScript使我們有能力創建動態頁面,網頁中的每一個元素都可以產生某些觸發JavaScript函數的事件。我們可以認為事件是可以被JavaScript偵測到的一種行
用PHP嘗試RabbitMQ(amqp擴展)實現消息的發送和接收
創建 hive 路由 arc href nbsp str rabbit strong 消費者:接收消息 邏輯:創建連接-->創建channel-->創建交換機-->創建隊列-->綁定交換機/隊列/路由鍵-->接收消息 生產者:發送消息 邏輯
linux上使用netstat查看當前服務和監聽端口
當前 參數 targe listen round 服務 sed small 說明 netstat這個命令常用在網絡監控方面。利用這個命令,可以查看當前系統監聽的服務和已經建立的服務,以及相應的端口、協議等信息。netstat參數說明netstat參數雖然很多,但是常用的不多
Android URLConnection發送Get請求 HttpGet封裝
返回 turn ava cep obj pub rac stack upn 一.使用URLConnection發送Get請求 1.與服務器建立連接: URLConnection connection=new URL(“https://www.baidu.com/”).op
Vue--axios:vue中的ajax異步請求(發送和請求數據)
lan his src 操作 ajax請求 itl func gin 出錯 一.使用axios發送get請求 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <me
post方式發送和解析xml
httpclient post xml public void etcauthorize(String authCode, String clientState) { logger.info("CMCasController- etcauthorize start... "); V
HTML5 瀏覽器返回按鈕/手機返回按鈕事件監聽
手機 鎖定 listitem con 按鈕 spa color cnblogs java 1.HTML5 History對象 支持使用pushState()方法修改地址欄地址,而不刷新頁面。 popstate事件 當history實體被改變時,popstate事件將會發生
JavaWeb基礎 Cookie 發送和接收cookie
response html getname myeclipse cookies keyword server word head 禮悟: 好好學習合思考,尊師重道存感恩。葉見尋根三返一,江河湖海同一體。 虛懷若谷良心主,願行無悔給最苦。讀書鍛煉強身
ActiveMQ 發送和就收消息
ace listen OS factor row conn ack 多個 tar 一、添加 jar 包 <dependency> <groupId>org.apache.activemq</groupId> <ar
spring 自定義事件發布及監聽(簡單實例)
講解 new 繼承 概念 接口 處理 啟動 lca 事件對象 前言: Spring的AppilcaitionContext能夠發布事件和註冊相對應的事件監聽器,因此,它有一套完整的事件發布和監聽機制。 流程分析: 在一個完整的事件體系中,除了事件和監聽器以外,還應該有3個概
Postfix郵件發送和接收實驗
多多指教Postfix郵件發送和接收實驗首先打開三臺虛擬機分別是linux、windows7(兩臺)。把三臺虛擬機的網卡設置成僅主機模式,linux虛擬機做dns服務器,給兩臺windows7配置IP和dns地址,IP地址的網段要和dns的地址在同一網段。兩臺Windows7虛擬機能夠ping通dns服務器的