我想连接两个客户端(通过TCP/IP套接字).客户端可以使用中间服务器发现彼此.一旦客户发现彼此,就不应该有任何服务器的参与.
我对此做了一些研究,发现很多人都在暗示JXTA.但我想从头开始自己创建协议(因为将来我可能也必须使用WebSockets实现相同的功能(当我的客户端是浏览器时)).目前,我的客户可以是桌面应用程序或移动应用程序.
我的问题是:
客户如何在服务器上发现彼此?如果服务器相互发送客户端的全局IP地址,那么该信息是否足以创建对等连接?如果客户端位于同一LAN网络且服务器位于不同的WAN上,该怎么办?
客户端具有动态IP地址.即使它有一个活动套接字,它们的IP也能突然改变吗?
对等连接是否可靠传输非连续数据(如聊天应用程序)?
[注意:通过点对点连接,我的意思是建立一个客户端 - 服务器TCP/IP套接字连接(使用Java),使其中一个客户端作为临时套接字服务器]
提前致谢.
我有一个调用 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 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)
有没有办法获得这些文件的访问权限?
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) android ×2
alarmmanager ×1
collections ×1
hashset ×1
java ×1
networking ×1
p2p ×1
set ×1
unique ×1