【问题标题】:JavaME, Implementing Peer to Peer communicationJavaME,实现点对点通信
【发布时间】:2010-01-07 19:57:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: java java-me mobile-phones p2p


    【解决方案1】:

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

    但也不是很难推出自己的产品。但是,我还没有看到任何用于 Java ME 的 HTTP 服务器端库,因此使用 HTTP 可能比必要的工作量更大。我可能只是在 TCP 套接字上实现一个自定义协议,因为您似乎不需要与已经存在的任何东西进行互操作。

    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 属性注册应用程序,这样您就不必运行应用程序,但系统会在尝试连接时唤醒它某个港口。我从来没有真正实现过这个,所以我不能提供更多的建议。

    【讨论】:

    • 我唯一担心的是,如果多个对等方(例如 3 个)尝试查询一个电话服务器套接字,它将必须创建 3 个线程来为每个服务器提供服务,我不确定同时有多少个手机可以运行线程,这里我说的是 S60 第 5 版手机,它在同类产品中非常先进,但我没有这些手机如何处理线程的统计数据。欢迎任何想法。
    • 同时拥有三个甚至更多线程应该不会有任何问题,但如果它们都在使用 CPU,它会降低应用程序的速度。因此,如果服务包含繁重的处理,一种方法是让一个线程只进行处理,而通信线程通过单个共享队列为其提供服务;这就是我构建一个应用程序并且没有任何性能问题的方式。或者,如果您真的担心创建线程,请不要;只需让服务器串行处理消息并在客户端无法连接时为客户端实施退避方案。
    • 谢谢您的建议,我无法理解您提到的关于在端口上侦听套接字的警告,为什么其他手机无法连接到它?启动浏览器对我来说真的很麻烦!能否请您详细介绍一下您的经历?
    • 问题是网络没有被初始化,只是因为监听是在一个套接字上开始的;这些电话(不过这是几年前的事了)在访问网络之前需要打开一个活动连接,因此即使套接字正在侦听,也无法连接到实际无线网络上的设备。但是如果这对你有影响(它可能不会),你也可以,比如说,打开一个到你自己 IP 地址的虚拟连接;这应该可以工作,并且都在您的应用程序中。
    • 感谢分享您的经验!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2019-09-15
    • 2019-06-11
    • 2021-05-08
    • 2016-07-13
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多