代码之家  ›  专栏  ›  技术社区  ›  Kevin Boyd

javame,实现点对点通信

  •  1
  • Kevin Boyd  · 技术社区  · 14 年前

    我有4部手机连接到一个WiFi接入点,我知道所有这些设备的MAC/IP,包括WiFi接入点。

    我需要实现这些电话之间的通信,一种点对点的通信,我在考虑使用插座,但是每个电话都要实现一个服务器插座和每个电话上的插座,这样可以吗?

    这些手机的IP地址将在192.168的私人范围内。我可以用类似的东西吗 http://192.168.xx.xx/port 和任何使用HTTP的电话联系?我可以使用什么类型的类来实现这一点,或者是否有一个现成的框架可以直接使用?

    1 回复  |  直到 14 年前
        1
  •  2
  •   JaakkoK    14 年前

    你的计划很好:你也可以让电话在插座上听。如果您只想进行点对点通信,并且对正在编写的应用程序更感兴趣,那么您可能需要看一下 JXTA 这是一个颇受欢迎的Java P2P系统。我不知道,我也听说过一些关于它性能的坏消息,但是对于您的应用程序来说,它可能是合适的。

    但也不难自己动手。但是,我还没有看到任何JavaME的HTTP服务器端库,所以使用HTTP可能比必要的工作更多。我可能只是在TCP套接字上实现一个自定义协议,因为看起来您不需要与现有的任何东西进行互操作。

    JavaME中的Socket通信是通过通用连接框架,在 javax.microedition.io 包,从客户端看,它与使用HTTP连接完全相同,例如

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

    然后你可以得到一个 InputStream OutputStream 与之联系,或 DataInputStream DataOutputStream 如果要发送二进制数据。

    在服务器端,您可以

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

    这个 acceptAndOpen 在建立连接之前阻塞,因此如果服务器需要做其他事情,请确保将连接接受放入自己的线程。

    警告:几年前我做这个的时候,我发现仅仅在一个插座上监听并不能打开所有电话的网络,所以即使服务器开始监听,也无法连接到它,因为它不在网络上。我解决这个问题的方法是在电话上打开Web浏览器,但是任何打开套接字的客户机都是足够的,所以您也可以通过自己尝试打开客户机连接从应用程序中打开它。

    还有一个叫做push注册表的东西。创建MIDlet时,可以使用 MIDlet-Push JAD文件中的属性,这样您就不必运行应用程序,但当在某个端口上尝试连接时,系统会将其唤醒。我从来没有真正实现过这一点,所以我不能再就此给出任何建议。