当前位置:首页 » 文件管理 » 安卓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