1. 程式人生 > >Android手機發送和監聽UDP資料

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 URLConnectionGet請求 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服務器的