我正在尝试通过专用网络上的UDP广播,通过WiFi将多声道音频从一台服务器发送到多台客户端计算机.
我使用名为Pure Data的软件,使用名为netsend~和netreceive~的UDP广播工具.代码在这里:http: //www.remu.fr/sound-delta/netsend ~/
简而言之,我能够在点对点网络中向一台客户端计算机发送9个频道,但是当我尝试向2个客户端播放广播时(尚未尝试更多),我得到了没有声音.我可以压缩音频,并通过UDP广播将4个压缩的信道(大约10%未压缩的大小)成功发送到2个客户端.或者我可以通过UDP广播向1个客户端发送1个频道,但有一些故障.
WiFi路由器是Linksys WRT300N.所有计算机都运行Windows XP.IP地址为192.168.1.x,子网掩码为255.255.255.0,子网广播地址为192.168.1.255.
我很好奇 - 路由器中的UDP广播包会发生什么?如果我的子网掩码为255.255.255.0,那么路由器是否会为广播地址发送的每个数据包生成254个数据包?
我的WiFi带宽至少为100Mbps,但我似乎无法通过UDP广播向多个客户端发送超过10Mbps的音频.
是什么阻止我将音频发送到WiFi的带宽限制?
有关套接字代码修改,网络设置,路由器设置,子网修改的任何建议......非常感谢!
谢谢尼克
我有这必须停止,直到接收到短信......一个简单的主要活动如何从启动方法MainActivity的范围内BroadcastReceiver的onReceive()方法?
有信号和等待吗?我是否可以通过待处理的内容Intent,或者如何实现此通信?
当我尝试ping我的LAN上的广播地址时,它每次只显示来自3个主机的ICMP回复,即使有许多主机连接到LAN.
对于广播地址,我做到了
$ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:1b:38:09:0b:26
inet addr:172.30.120.152 Bcast:172.30.127.255 Mask:255.255.248.0
inet6 addr: fe80::21b:38ff:fe09:b26/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:831096 errors:0 dropped:0 overruns:0 frame:0
TX packets:13022 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:66620362 (66.6 MB) TX bytes:3099025 (3.0 MB)
Interrupt:21 Base address:0x2000
Run Code Online (Sandbox Code Playgroud)
我使用Bcast addr 172.30.127.255来ping每个人......
$ping -b 172.30.127.255
WARNING: pinging broadcast address
PING 172.30.127.255 (172.30.127.255) 56(84) bytes of data.
64 bytes from 172.30.120.1: icmp_seq=1 ttl=255 time=0.809 ms
64 bytes from 172.30.120.62: icmp_seq=1 ttl=64 time=1.06 …Run Code Online (Sandbox Code Playgroud) 我正在拦截带有一些信息的短信.然后在我的SmsListener中,我正在创建状态栏中显示的通知.然后,当用户点击我想要的通知时
我的活动被定义为
<activity
android:name=".MainActivity"
android:screenOrientation="sensor"
android:label="@string/app_name"
android:launchMode="singleTask"/>
Run Code Online (Sandbox Code Playgroud)
活动启动为
Intent i = new Intent();
i.setClass(context, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
Run Code Online (Sandbox Code Playgroud)
同样在我的活动中,我已经重写了onNewActivity方法
@Override
public void onNewIntent(Intent intent){
super.onNewIntent(intent);
// I have data from broadcast in intent variable passed to this activity
processDataFromBroadcast(intent);
}
Run Code Online (Sandbox Code Playgroud)
如果MainActivity已经存在,它可以正常工作,但是如果MainActivity不存在则会启动但是不会调用onNewIntent
然后我尝试从onCreate调用processDataFromBroadcast : processDataFromBroadcast(getIntent()). 第一次将数据从我的广播正确传递到活动.但是,如果MainActivity被发送到后台然后再次被带到前台,则调用onCreate或onNewIntent,并且再次执行processDataFromBroadcast,并通过广播发送意图,因此我的MainActivity会在应用程序带到前台时每次使用广播数据进行更新 - 后者是不需要的,我怎么能让我的活动在第一次处理后忘记这个意图.
这是示例应用程序.
有没有办法在重新安装时检测应用程序代码.
我看到可以通过收听广播接收器中的PACKAGE_REPLACED事件来检测市场上的应用更新.但是,如果从编辑器(eclipse)重新安装应用程序,则这些事件不会传递给应用程序.
我的要求是我禁用了一个组件(Launcher活动).如果未启用,则应用安装将失败.每次重新安装之前我想启用此组件.
我在谈论重新安装之前在市场上发布.在开发时,每次重新安装应用程序以测试一些修改时,我想从我的应用程序中检测到这一点并启用组件.
我正在开发一个使用TCP进行设备连接的Android应用程序.问题是我是套接字编程的新手.我已成功制作了服务器和客户端代码.每个客户端都可以连接到服务器,服务器可以回复客户端.但我似乎无法使服务器同时向所有连接的客户端发送消息.使服务器向客户端广播消息的步骤是什么?这是服务器代码:
ServerSocket server = null;
try {
server = new ServerSocket(9092); // start listening on the port
} catch (IOException e) {
Log.d("btnCreate onClick", "Could not listen on port: 9092");
}
Socket client = null;
while(true) {
try {
client = server.accept();
} catch (IOException e) {
Log.d("btnCreate onClick", "Accept Failed");
}
//start a new thread to handle this client
Thread t = new Thread(new ClientConn(client));
t.start();
}
Run Code Online (Sandbox Code Playgroud)
和服务器线程:
class ClientConn implements Runnable {
private Socket client;
ClientConn(Socket client) { …Run Code Online (Sandbox Code Playgroud) 我想在点击通知中的按钮时发送LocalBroadcast.我知道如何通过常规广播来做到这一点,但我想将广播保留在我的应用程序中.这可能吗?
我的代码大致是:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
.setContentTitle("Title")
.setContentText("content")
.setSmallIcon(R.drawable.icon1)
.setContentIntent(pIntent)
.setAutoCancel(true);
Intent myButtonIntent = new Intent(BUTTON_PRESSED);
// the following line gives me a normal broadcast, not a LocalBroadcast
PendingIntent myButtonpIntent = PendingIntent.getBroadcast(context, 12345, myButtonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.addAction(R.drawable.icon2, "OK", myButtonpIntent);
Notification notification = notificationBuilder.build();
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Run Code Online (Sandbox Code Playgroud)
并且:
BroadcastReceiver bReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(BUTTON_PRESSED)) {
// do something
}
}
};
LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter(); …Run Code Online (Sandbox Code Playgroud) 据我了解,广播变量只创建一次,但多次使用.所以我发现我应该在单例类中创建一个广播变量,这是一个坏主意吗?使用单例类来保存广播变量的优缺点是什么?
我的服务中有一个广播接收器,当我从我的活动发送广播以停止服务时,我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.BroadcastReceiver.onReceive(android.content.Context, android.content.Intent)' on a null object reference
Run Code Online (Sandbox Code Playgroud)
这是我的服务类:
public class PhraseService extends Service{
public static List<Phrase> phrases;
private Context context;
private static final String PHRASE_SERVICE_BROADCAST_ID = "com.cryogenos.safephrase.PHRASE_SERVICE_BROADCAST_ID";
private BroadcastReceiver command_broadcast_receiver;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.context = getApplicationContext();
LocalBroadcastManager.getInstance(this).registerReceiver(command_broadcast_receiver, new IntentFilter(PHRASE_SERVICE_BROADCAST_ID));
Log.i("COS", "STARTED SELF");
/* Handle any command sent by the app here */
command_broadcast_receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent …Run Code Online (Sandbox Code Playgroud) 我正在开发一个从Wi-Fi摄像机接收UPD广播数据包的应用程序。在我发现在Google Pixel 2 / Pixel 2 XL接收UPD广播数据包问题之前,它曾经很好。
为了弄清原因,我制作了2个测试应用程序:一个是UPD广播发送器(https://senatech.box.com/s/gmhr391pbl32lqai0mhkffyk6j0ckle5),另一个是UDP广播接收器(https://senatech.box.com/ s / abamuor47nlafocs035nfuj90d0uvx0m)。
我已经在某些Android设备上对它们进行了测试,发现Google Pixel 2 / Pixel 2 XL无法接收UDP广播数据包。除Pixel 2 / Pixel 2 XL以外的Android设备都可以正常工作。Android 8.1上的Nexus也可以正常运行。
我尝试搜索类似的问题,但发现了一些问题,例如Android 8.0(https://bugreports.qt.io/browse/QTBUG-64233)未收到的UDP广播数据包。我认为,尽管它是用QT编写的,但这可能是由相同的问题引起的。
这是有关UDP广播发送方的简短代码
public void sendUPDBroadcast() {
Thread thread = new Thread() {
@Override
public void run() {
DatagramSocket ds = null;
int port = 0;
String udpData = "";
try {
port = Integer.parseInt(etPort.getText().toString());
udpData = etUDPData.getText().toString();
InetAddress ia = InetAddress.getByName("192.168.255.255");
ds = new DatagramSocket(port);
DatagramPacket data = new …Run Code Online (Sandbox Code Playgroud)