當前位置:首頁 » 文件管理 » 安卓udp緩存

安卓udp緩存

發布時間: 2022-05-26 19:33:07

『壹』 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();
}
}

希望能幫到你。

『貳』 如何清空udp的接收緩沖區

實際上處理這種問題時應該這樣,客戶端和服務端都加上自己定義的報文,在報文中加個包頭包尾,這樣就可以避免這個問題了,當接收到數據後,放入緩沖區,然後一個一個數據包的取出來進行分析。

『叄』 windows下怎麼修改UDP緩存

vi
/etc/sysctl.conf
增加或修改
net.ipv4.udp_mem項
net.ipv4.udp_mem
=
min
pressure
max
再設一下
net.ipv4.udp_rmem_min
具體含義man
udp
查看
完成後執行
sysctl
-p
生效

『肆』 求助如何清空udpclient發送的緩存區

通過Socket 發送接收消息遇到個問題C# codeSocket newSocket = socket.Accept();newSocket.Receive(messages);獲取消息沒問題 但是總有緩存區無法清空的問題比如說我先發一句: 我是中國人服務端能正確接收到這句消息: 我是中國人這邊再發送一個...

『伍』 安卓端使用socket的udp方式進行網路通信,為什麼服務端接收不到數據。

1、檢查客戶端和服務端的埠號是否一致;
2、接收端的socket要採用block模式,數據收到後列印出來.

『陸』 java使用UDP 如果我定義了一個1024byte的緩存,而接收到的只有16個byte剩餘的怎麼處理

byte[] b = new byte[1024];
int len = 輸入流.read(b)://從輸入流中讀取數據裝填到數組b中,len保存的是讀到的有效位元組數
while( len != - 1 ){ //為-1表示沒有數據可讀
String str = new String(b, 0, len); //把裝數字的數組中本次讀到的數據new成string
或者
輸出流.write( b, 0, len); //向輸出流中寫len個位元組數據。剩下的你不用管它。
}
記住,len記錄了每次讀到的有效位元組個數,如果接收的只有16個,那麼你只用取16個拿出來用,就是准確的數據。

『柒』 我怎麼可以設置下的Socket UDP的緩沖區大小

有3點值得說明:
1. 上面我們僅僅寫了接收的內核緩沖區, 關鍵字是SO_RCVBUF, 如果是發送的內核緩沖區, 那就用SO_SNDBUF, 有興趣的童鞋可以稍微修改一下上面程序即可。
2. 從程序的結果我們可以看到, sockClient1和sockClient2兩者的發送內核緩沖區沒有任何關系。
3. 聽一網友說過, tcp才有所謂的內核緩沖區, udp沒有。

『捌』 UDP中將struct skb_buff作為緩存區 具體如何使用

一. SKB_BUFF的基本概念
1. 一個完整的skb buff組成
(1) struct sk_buff--用於維護socket buffer狀態和描述信息
(2) header data--獨立於sk_buff結構體的數據緩沖區,用來存放報文分組,使各層協議的header存儲在連續的空間中,以方便協議棧對其操作
(3) struct skb_shared_info --作為header data的補充,用於存儲ip分片,其中sk_buff *frag_list是一系列子skbuff鏈表,而frag[]是由一組單獨的page組成的數據緩沖區

『玖』 linux下怎麼設置udp接收緩存最大值

vi /etc/sysctl.conf
增加或修改 net.ipv4.udp_mem項
net.ipv4.udp_mem = min pressure max
再設一下 net.ipv4.udp_rmem_min
具體含義man udp 查看
完成後執行 sysctl -p 生效

『拾』 udp Socket 發送緩沖區 最大可以為多大

internet上的標准mtu值為576位元組,所以我建議在進行internet的udp編程時.最好將udp的數據長度控制項在548位元組(576-8-20)以內.
ipv4協議規定ip層的最小重組緩沖區大小為576!所以,建議udp包不要超過這個大小,而不是因為internet的標准mtu是576!

熱點內容
如何開啟電腦伺服器無法上網 發布:2025-01-23 17:37:06 瀏覽:391
安卓手機鎖了怎麼開 發布:2025-01-23 17:21:18 瀏覽:137
經濟學演算法 發布:2025-01-23 17:13:46 瀏覽:421
如何和軟體聯系伺服器 發布:2025-01-23 17:13:00 瀏覽:800
javacrc16演算法 發布:2025-01-23 17:11:31 瀏覽:225
編程加圖片 發布:2025-01-23 17:10:33 瀏覽:567
中國風網站源碼 發布:2025-01-23 17:05:56 瀏覽:680
pythonfilter用法 發布:2025-01-23 17:04:26 瀏覽:569
java轉number 發布:2025-01-23 16:58:11 瀏覽:477
解壓的英語作文 發布:2025-01-23 16:45:05 瀏覽:970