JavaME,实现点对点通信

标签 java java-me mobile-phones p2p

我有 4 部手机连接到 Wifi 接入点,并且我知道所有这些手机(包括 Wifi 接入点)的 MAC/IP。

我需要在每个电话之间实现通信,一种点对点通信,我正在考虑使用套接字,但是每个电话都必须在每个电话上实现 ServerSocket 和 Socket 这样可以吗?

这些手机的 IP 将在私有(private)范围 192.168...所以我可以使用类似 http://192.168.xx.xx/port 的东西吗?并使用 http 联系任何电话?我可以使用什么样的类来实现这一点,或者是否有一个可以直接使用的现成框架?

最佳答案

您的计划很好:您也可以让电话在套接字上监听。如果您只是想进行点对点通信并且对您正在编写的应用程序更感兴趣,您可能需要查看 JXTA ,这是一个比较流行的 Java P2P 系统。我不知道,而且我听说过一些关于其性能的坏消息,但对于您的应用程序来说,它可能是合适的。

但是自己推出也不是很难。但是,我还没有看到任何用于 Java ME 的 HTTP 服务器端库,因此使用 HTTP 可能会比必要的工作更多。我可能只会通过 TCP 套接字实现自定义协议(protocol),因为您似乎不需要与现有的任何协议(protocol)进行互操作。

Java ME 中的套接字通信是通过通用连接框架(位于 javax.microedition.io 包中)进行的,从客户端来看,它与使用 HTTP 连接完全相同,即类似

String url = "socket://192.168.xxx.xxx:12345";
SocketConnection conn = (SocketConnection) Connector.open(url);

然后您可以从中获取连接的InputStreamOutputStream,或者DataInputStreamDataOutputStream如果你想发送二进制数据。

在服务器端你会这样做

String url = "socket://:12345";
ServerSocketConnection sock = (ServerSocketConnection) Connector.open(url);
SocketConnection conn = (SocketConnection) sock.acceptAndOpen();

acceptAndOpen 会阻塞,直到建立连接,因此如果服务器执行其他操作很重要,请确保将连接接受放入其自己的线程中。

需要注意的是:几年前我这样做时,我发现仅监听套接字并不能打开所有手机上的网络,因此即使服务器开始监听,也无法连接到因为它不在网络上。我解决这个问题的方法是在手机上打开 Web 浏览器,但是任何打开套接字的客户端就足够了,因此您也可以通过尝试自己打开客户端连接来从应用程序中完成此操作。

还有一个叫做推送注册表的东西。当您创建 Midlet 时,可以使用 JAD 文件中的 MIDlet-Push 属性注册应用程序,这样您不必让应用程序运行,但系统会唤醒它当尝试在某个端口上建立连接时。我从未真正实现过这个,所以我无法就此提供更多建议。

关于JavaME,实现点对点通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2023223/

相关文章:

mobile - 与手机同步数据的策略?

android - 使用 openGL ES 管理不同分辨率的手机

java - j2me 应用程序不能在手机上运行

java - -jar 命令终端给我 "-bash: -jar: command not found"但我有当前的 java 版本

java - 共享 EntityManager 上下文中使用的事务的范围是什么?

java - 将对象转换为通用类型以返回

string - java-me:将字符串转换为 bool 值

java-me - 读取/写入 J2ME 中的文件,而无需不断纠缠用户

python - 在 App Engine 中检测和重定向移动浏览器的最佳方法是什么?

java - Android 中谷歌分析事件跟踪器的简单示例