小编PC.*_*PC.的帖子

使用中间服务器创建对等连接

我想连接两个客户端(通过TCP/IP套接字).客户端可以使用中间服务器发现彼此.一旦客户发现彼此,就不应该有任何服务器的参与.

我对此做了一些研究,发现很多人都在暗示JXTA.但我想从头开始自己创建协议(因为将来我可能也必须使用WebSockets实现相同的功能(当我的客户端是浏览器时)).目前,我的客户可以是桌面应用程序或移动应用程序.

我的问题是:

  1. 客户如何在服务器上发现彼此?如果服务器相互发送客户端的全局IP地址,那么该信息是否足以创建对等连接?如果客户端位于同一LAN网络且服务器位于不同的WAN上,该怎么办?

  2. 客户端具有动态IP地址.即使它有一个活动套接字,它们的IP也能突然改变吗?

  3. 对等连接是否可靠传输非连续数据(如聊天应用程序)?

[注意:通过点对点连接,我的意思是建立一个客户端 - 服务器TCP/IP套接字连接(使用Java),使其中一个客户端作为临时套接字服务器]

提前致谢.

networking p2p client-server network-protocols

4
推荐指数
1
解决办法
2520
查看次数

AlarmManager 在模拟器中触发但不在物理设备上触发

我有一个调用 AlarmManager 的应用程序

Intent intent;
intent = new Intent(context, MyEventReceiver.class);  
PendingIntent appIntent = PendingIntent.getBroadcast(context, 0,
intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
appIntent);
Run Code Online (Sandbox Code Playgroud)

在 Manifyingt 中,我有强制性条目

    <receiver android:name=".MyEventReceiver"
   android:process=":remote" />
Run Code Online (Sandbox Code Playgroud)

MyEventReceiver 看起来像这样

public class MyEventReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        try
        {
            // DO SOME WORK
        }
        catch (Exception e)
        {
            Log.e("MyEventReceiver", e.getMessage().toString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当警报被激活时,即使我的应用程序没有运行,也应该启动 MyEventReceiver 并做一些事情。在模拟器中是这种情况,但在实际设备上却并非如此。

例如,我将在模拟器上启动 MyApplication,在 DDMS 中我可以看到 MyApplication 运行的过程。在 MyApplication 中,我添加了一个警报,然后在 DDMS 中终止了 MyApplication 的进程。当警报触发 MyEventReceiver …

android broadcastreceiver alarmmanager

3
推荐指数
1
解决办法
1661
查看次数

即使在获得平台签名后也无法读取系统文件

我已经构建了一个自定义的Android ROM.我已经使用平台签名签署了我的应用程序,并已添加android:sharedUserId="android.uid.system"到清单文件中.我的应用程序被授予所有"签名"和"系统"级别权限,但未授予对系统文件的访问权限.

    Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.ACCESS_SURFACE_FLINGER")== PackageManager.PERMISSION_GRANTED)); // true
    Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.READ_FRAME_BUFFER")== PackageManager.PERMISSION_GRANTED));      // true
    Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.INJECT_EVENTS")== PackageManager.PERMISSION_GRANTED));          // true

    Log.w("PC", String.valueOf(new File("/dev/graphics/fb0").canRead()));                      // false
    Log.w("PC", String.valueOf(new File("/data/misc/wifi/wpa_supplicant.conf").canRead()));   // false
Run Code Online (Sandbox Code Playgroud)

文件的权限是:

ls -l /dev/graphics/fb0
crw-rw---- root     graphics  29,   0 2014-02-12 09:43 fb0

ls -l /data/misc/wifi/wpa_supplicant.conf
-rwxrwx--- wifi     wifi          282 2014-02-11 19:04 wpa_supplicant.conf
Run Code Online (Sandbox Code Playgroud)

有没有办法获得这些文件的访问权限?

android android-permissions

2
推荐指数
1
解决办法
2704
查看次数

Java Set获取重复条目

JavaDoc将set定义为:

不包含重复元素的集合.更正式地说,集合不包含元素e1和e2对,因此e1.equals(e2)

为了验证相同,我创建了一个非常简单的程序:

import java.util.HashSet;

public class CheckHashSet {
    public static void main(String[] args) {
        HashSet<Employee> set = new HashSet<Employee>();
        set.add(new Employee(10));
        set.add(new Employee(10));
        System.out.println(set.size());
        System.out.println(new Employee(10).equals(new Employee(10)));
    }

    private static class Employee implements Comparable<Employee> {
        private final int id;
        public Employee(int id) {
            this.id = id;
        }
        @Override
        public int compareTo(Employee o) {
            return this.id - o.id; 
        }

        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Employee) {
                return compareTo((Employee)obj)==0;
            }
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是

2
true …
Run Code Online (Sandbox Code Playgroud)

java collections unique set hashset

1
推荐指数
1
解决办法
2522
查看次数