⑴ android udp接收不到數據
1、可先在oncreate()方法裡面實例化一個WifiManager.MulticastLock 對象lock;具體如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在調用廣播發送、接收報文之前先調用lock.acquire()方法;
3、用完之後及時調用lock.release()釋放資源,否決多次調用lock.acquire()方法,程序可能會崩,詳情請見
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;記得在配置文件裡面添加如下許可權:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
經過這樣處理後,多數手機都能正常發送接收到廣播報文。
本小點轉載自Android手機接收不到UDP報文
二、在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。
在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。但是如果UDP包中指定了目標主機的地址的話,那麼android端就能正常接收。
下面上一段代碼,大家可用這段代碼進行測試。
1、在一個Service裡面,我們創建一個線程
public void onCreate() {//用於創建線程
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
udphelper = new UdpHelper(manager);
//傳遞WifiManager對象,以便在UDPHelper類裡面使用MulticastLock
udphelper.addObserver(MsgReceiveService.this);
tReceived = new Thread(udphelper);
tReceived.start();
super.onCreate();
}
2、弄一個UDP幫助類,這個類主要用於發送和接收數據
package com.example.com.ihome.bang.util;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Observable;
import com.example.com.ihome.bang.tool.SendThread;
import android.net.wifi.WifiManager;
import android.util.Log;
/**
*
* UdpHelper幫助類
*
* @author 陳喆榕
*
*/
public class UdpHelper implements Runnable {
public Boolean IsThreadDisable = false;//指示監聽線程是否終止
private static WifiManager.MulticastLock lock;
InetAddress mInetAddress;
public UdpHelper(WifiManager manager) {
this.lock= manager.createMulticastLock("UDPwifi");
}
public void StartListen() {
// UDP伺服器監聽的埠
Integer port = 8903;
// 接收的位元組大小,客戶端發送的數據不能超過這個大小
byte[] message = new byte[100];
try {
// 建立Socket連接
DatagramSocket datagramSocket = new DatagramSocket(port);
datagramSocket.setBroadcast(true);
DatagramPacket datagramPacket = new DatagramPacket(message,
message.length);
try {
while (!IsThreadDisable) {
// 准備接收數據
Log.d("UDP Demo", "准備接受");
this.lock.acquire();
datagramSocket.receive(datagramPacket);
String strMsg=new String(datagramPacket.getData()).trim();
Log.d("UDP Demo", datagramPacket.getAddress()
.getHostAddress().toString()
+ ":" +strMsg );this.lock.release();
}
} catch (IOException e) {//IOException
e.printStackTrace();
}
} catch (SocketException e) {
e.printStackTrace();
}
}
public static void send(String message) {
message = (message == null ? "Hello IdeasAndroid!" : message);
int server_port = 8904;
Log.d("UDP Demo", "UDP發送數據:"+message);
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress local = null;
try {
local = InetAddress.getByName("255.255.255.255");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int msg_length = message.length();
byte[] messageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try {
s.send(p);
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
StartListen();
}
}
希望能幫到你。
⑵ Android使用udp視頻怎麼實現
vplayer播放器可以實現,你應用超市或者網路搜索下這個軟體試試
⑶ android:udp廣播
首先手機作為終端 可以不必要知道終端的數量、 還有就是我建議你多學習下基礎,android的廣播機制不是把廣播在終端之間傳輸,廣播是在應用程序裡面發送,在應用程序進行接收。個人建議基礎才是王道。 對於你現在這個問題,不妨採用發送消息的方式 實現該功能。一個終端發送消息 其他終端接收消息,當然也相當於寫一個socket通信。通信建立之後 ,可以取得各個連接的終端的IP 然後怎麼邏輯就看你怎麼寫演算法了。還有就是,這個功能也可以用消息推送的方式(建議採用此方法)、android系統內置有消息推送,邏輯都和上述的差不多,至於具體用那些方法 那些內置類,個人建議多查API。軟體開發必須靠自學。。。。
⑷ android網路編程學什麼,如何學習android網路編程
第一個問題解答:android網路編程學習內容詳解:
1.0 Android基礎入門教程
1.1 背景相關與系統架構分析
1.2 開發環境搭建
1.2.1 使用Eclipse + ADT + SDK開發Android APP
1.2.2 使用Android Studio開發Android APP
1.3 SDK更新不了問題解決
1.4 Genymotion模擬器安裝
1.5.1 Git使用教程之本地倉庫的基本操作
1.5.2 Git之使用GitHub搭建遠程倉庫
1.6 .9(九妹)圖片怎麼玩
1.7 界面原型設計
1.8 工程相關解析(各種文件,資源訪問)
1.9 Android程序簽名打包
1.11 反編譯APK獲取代碼&資源
2.1 View與ViewGroup的概念
2.2.1 LinearLayout(線性布局)
2.2.2 RelativeLayout(相對布局)
2.2.3 TableLayout(表格布局)
2.2.4 FrameLayout(幀布局)
2.2.5 GridLayout(網格布局)
2.2.6 AbsoluteLayout(絕對布局)
2.3.1 TextView(文本框)詳解
2.3.2 EditText(輸入框)詳解
2.3.3 Button(按鈕)與ImageButton(圖像按鈕)
2.3.4 ImageView(圖像視圖)
2.3.5.RadioButton(單選按鈕)&Checkbox(復選框)
2.3.6 開關按鈕ToggleButton和開關Switch
2.3.7 ProgressBar(進度條)
2.3.8 SeekBar(拖動條)
2.3.9 RatingBar(星級評分條)
2.4.1 ScrollView(滾動條)
2.4.2 Date & Time組件(上)
2.4.3 Date & Time組件(下)
2.4.4 Adapter基礎講解
2.4.5 ListView簡單實用
2.4.6 BaseAdapter優化
2.4.7ListView的焦點問題
2.4.8 ListView之checkbox錯位問題解決
2.4.9 ListView的數據更新問題
2.5.0 構建一個可復用的自定義BaseAdapter
2.5.1 ListView Item多布局的實現
2.5.2 GridView(網格視圖)的基本使用
2.5.3 Spinner(列表選項框)的基本使用
2.5.4 AutoCompleteTextView(自動完成文本框)的基本使用
2.5.5 ExpandableListView(可折疊列表)的基本使用
2.5.6 ViewFlipper(翻轉視圖)的基本使用
2.5.7 Toast(吐司)的基本使用
2.5.8 Notification(狀態欄通知)詳解
2.5.9 AlertDialog(對話框)詳解
2.6.0 幾種常用對話框基本使用
2.6.1 PopupWindow(懸浮框)的基本使用
2.6.2 菜單(Menu)
2.6.3 ViewPager的簡單使用
2.6.4 DrawerLayout(官方側滑菜單)的簡單使用
3.1.1 基於監聽的事件處理機制
3.2 基於回調的事件處理機制
3.3 Handler消息傳遞機制淺析
3.4 TouchListener PK OnTouchEvent + 多點觸碰
3.5 監聽EditText的內容變化
3.6 響應系統設置的事件(Configuration類)
3.7 AnsyncTask非同步任務
3.8 Gestures(手勢)
4.1.1 Activity初學乍練
4.1.2 Activity初窺門徑
4.1.3 Activity登堂入室
4.2.1 Service初涉
4.2.2 Service進階
4.2.3 Service精通
4.3.1 BroadcastReceiver牛刀小試
4.3.2 BroadcastReceiver庖丁解牛
4.4.1 ContentProvider初探
4.4.2 ContentProvider再探——Document Provider
4.5.1 Intent的基本使用
4.5.2 Intent之復雜數據的傳遞
5.1 Fragment基本概述
5.2.1 Fragment實例精講——底部導航欄的實現(方法1)
5.2.2 Fragment實例精講——底部導航欄的實現(方法2)
5.2.3 Fragment實例精講——底部導航欄的實現(方法3)
5.2.4 Fragment實例精講——底部導航欄+ViewPager滑動切換頁面
5.2.5 Fragment實例精講——新聞(購物)類App列表Fragment的簡單實現
6.1 數據存儲與訪問之——文件存儲讀寫
6.2 數據存儲與訪問之——SharedPreferences保存用戶偏好參數
6.3.1 數據存儲與訪問之——初見SQLite資料庫
6.3.2 數據存儲與訪問之——又見SQLite資料庫
7.1.1 Android網路編程要學的東西與Http協議學習
7.1.2 Android Http請求頭與響應頭的學習
7.1.3 Android HTTP請求方式:HttpURLConnection
7.1.4 Android HTTP請求方式:HttpClient
7.2.1 Android XML數據解析
7.2.2 Android JSON數據解析
7.3.1 Android 文件上傳
7.3.2 Android 文件下載(1)
7.3.3 Android 文件下載(2)
7.4 Android 調用 WebService
7.5.1 WebView(網頁視圖)基本用法
7.5.2 WebView和JavaScrip交互基礎
7.5.3 Android 4.4後WebView的一些注意事項
7.5.4 WebView文件下載
7.5.5 WebView緩存問題
7.5.6 WebView處理網頁返回的錯誤碼信息
7.6.1 Socket學習網路基礎准備
7.6.2 基於TCP協議的Socket通信(1)
7.6.3 基於TCP協議的Socket通信(2)
7.6.4 基於UDP協議的Socket通信
8.1.1 Android中的13種Drawable小結 Part 1
8.1.2 Android中的13種Drawable小結 Part 2
8.1.3 Android中的13種Drawable小結 Part 3
8.2.1 Bitmap(點陣圖)全解析 Part 1
8.2.2 Bitmap引起的OOM問題
8.3.1 三個繪圖工具類詳解
8.3.2 繪圖類實戰示例
8.3.3 Paint API之—— MaskFilter(面具)
8.3.4 Paint API之—— Xfermode與PorterDuff詳解(一)
8.3.5 Paint API之—— Xfermode與PorterDuff詳解(二)
8.3.6 Paint API之—— Xfermode與PorterDuff詳解(三)
8.3.7 Paint API之—— Xfermode與PorterDuff詳解(四)
8.3.8 Paint API之—— Xfermode與PorterDuff詳解(五)
8.3.9 Paint API之—— ColorFilter(顏色過濾器)(1/3)
8.3.10 Paint API之—— ColorFilter(顏色過濾器)(2-3)
8.3.11 Paint API之—— ColorFilter(顏色過濾器)(3-3)
8.3.12 Paint API之—— PathEffect(路徑效果)
8.3.13 Paint API之—— Shader(圖像渲染)
8.3.14 Paint幾個枚舉/常量值以及ShadowLayer陰影效果
8.3.15 Paint API之——Typeface(字型)
8.3.16 Canvas API詳解(Part 1)
8.3.17 Canvas API詳解(Part 2)剪切方法合集
8.3.18 Canvas API詳解(Part 3)Matrix和drawBitmapMash
8.4.1 Android動畫合集之幀動畫
8.4.2 Android動畫合集之補間動畫
8.4.3 Android動畫合集之屬性動畫-初見
8.4.4 Android動畫合集之屬性動畫-又見
9.1 使用SoundPool播放音效(Duang~)
9.2 MediaPlayer播放音頻與視頻
9.3 使用Camera拍照
9.4 使用MediaRecord錄音
10.1 TelephonyManager(電話管理器)
10.2 SmsManager(簡訊管理器)
10.3 AudioManager(音頻管理器)
10.4 Vibrator(振動器)
10.5 AlarmManager(鬧鍾服務)
10.6 PowerManager(電源服務)
10.7 WindowManager(窗口管理服務)
10.8 LayoutInflater(布局服務)
10.9 WallpaperManager(壁紙管理器)
10.10 感測器專題(1)——相關介紹
10.11 感測器專題(2)——方向感測器
10.12 感測器專題(3)——加速度/陀螺儀感測器
10.12 感測器專題(4)——感測器了解
10.14 Android GPS初涉
第二個問題解答:如何學習android網路編程:
1. Android學習之路,博客是Android新手必備資料。
2. 書不在多,適合就好,這里推薦一本Android和兩本Java書籍吧。
《第一行代碼》:郭霖大神的著作。
《Thinking In Java》:Java經典書籍,不必說。
《Effective Java》:Java進階必備書籍。
3. 有些人一開始看書也有困難,沒關系,那就去網上看視頻,結合視頻和書一起看,邊看邊敲。
4. 多去混GitHub,目前最流行的開源社區,多參與開源項目,慢慢試著讀牛人們的代碼,時機到的時候自己也可以為開源社區貢獻力量,可以這樣說在GitHub上認真混一年。
5. 關注一些Android界不錯的博客。
6. 善於利用搜索引擎,從用Google做起,學會英文關鍵字搜索,有問題第一時間想到去搜索而不是去請教別人。
⑸ android UDP通訊--圖片發送
PC端:
/**
*把照片轉換成base64格式
*@parampath照片路徑
*@return轉換後的二進制照片
*/
privateStringgetImageStr(Stringpath){
Stringbase64code=null;
FileInputStreamfis=null;
ByteArrayOutputStreambaos=null;
Filefile=newFile(path);
if(file.exists()){
try{
fis=newFileInputStream(path);
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
baos=newByteArrayOutputStream();
byte[]buffer=newbyte[1024];
intcount=0;
try{
while((count=fis.read(buffer))>=0){
baos.write(buffer,0,count);
}
base64code=newString(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
fis.close();
baos.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
returnbase64code;
}
android端:
/**
*將Base64編碼轉換為bitmap
*@parambase64Stringbase64字元串
*@return轉換後的bitmap
*/
privateBitmapbase64ToBitmap(Stringbase64String){
byte[]bytes=Base64.decode(base64String,Base64.DEFAULT);
Bitmapbitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
returnbitmap;
}
拿到bitmap,任意處理
⑹ android 如何用UDP協議接收無線硬體設備的數據
理論上來說是可以的,但是這個涉及到傳輸層的問題,需要你對通信原理、系統晶元、Android編程有很深的理解,建議放棄。
⑺ android子線程中怎麼使用udp收發數據
先實例化一個Handler再重寫handleMessage(Message msg)方法msg.getData().getXXX()獲得Thread線程發送的數據
⑻ C# 和Android的 TCP(UDP)通信
伺服器程序
它僅僅建立ServerSocket監聽,並使用Socket獲取輸入輸出流。
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//創建一個ServerSocket,用於監聽客戶端socket的連接請求
ServerSocket ss=new ServerSocket(30000);
//採用循環不斷接受來自客戶端的請求,伺服器端也對應產生一個Socket
while(true){
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
os.write("您好,您收到了伺服器的新年祝福!n".getBytes("utf-8"));
os.close();
s.close();
}
}}
客戶端程序
package my.learn.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
public class SimpleClient extends Activity {
private EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show = (EditText) findViewById(R.id.show);
try {
Socket socket = new Socket("自己計算機的IP地址", 30000);
//設置10秒之後即認為是超時
socket.setSoTimeout(10000);
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String line = br.readLine();
show.setText("來自伺服器的數據:"+line);
br.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Log.e("UnknownHost", "來自伺服器的數據");
e.printStackTrace();
} catch (IOException e) {
Log.e("IOException", "來自伺服器的數據");
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
⑼ android 如何通過udp發動byte[],要求超過0x69
我現在不太清楚你描述的這個問題,那我只能按我的理解來分析。首先,byte在Java裡面是8bit;C語言裡面沒有byte,但是相對應的應該是char,也是8bit。然後,client發1個byte數據(8bit),server也應該按照char去接收(8bit),怎麼能變成0xffffffe5(32bit)。最後,現在server可能按照int(32bit)去接收,導致僅僅收到8bit,系統自動補齊高位。固然,C/S雙方必須按照協議里規定的位元組去發送和接收,並且根據自己的語言,選擇相對應的類型。