JavaME,实现点对点通信

JavaME,实现点对点通信,java,java-me,mobile-phones,p2p,Java,Java Me,Mobile Phones,P2p,我有4部手机连接到一个Wifi接入点,我知道所有这些手机的MAC/IP,包括Wifi接入点 我需要在每部手机之间实现通信,一种点对点通信,我在考虑使用套接字,但是每部手机都必须在每部手机上实现一个服务器套接字和套接字,这样可以吗 这些手机的Ip将在192.168…的私人范围内。。。。所以我可以使用类似于和任何使用http的电话联系吗?我可以使用什么样的类来实现这一点,或者是否有一个现成的框架可以直接使用?您正在计划的很好:您也可以让手机监听套接字。如果您只想进行点对点通信,并且对正在编写的应用程

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

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


这些手机的Ip将在192.168…的私人范围内。。。。所以我可以使用类似于和任何使用http的电话联系吗?我可以使用什么样的类来实现这一点,或者是否有一个现成的框架可以直接使用?

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

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

Java ME中的套接字通信是通过通用连接框架进行的,该框架位于
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();
acceptiondopen
会一直阻塞,直到建立了连接,因此,如果服务器需要执行其他操作,请确保将连接接受放在自己的线程中

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


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

我唯一担心的是,如果多个对等方(例如3个)尝试查询一个电话服务器套接字,它将必须创建3个线程来为每个端口提供服务,我不确定一部电话可以同时运行多少个线程,这里我说的是S60,第五版手机在同类产品中相当先进,但我没有这些手机处理线程的统计数据。任何想法都是受欢迎的。如果同时有三个或更多线程,应该不会有任何问题,但如果它们都在使用CPU,可能会降低应用程序的速度。因此,如果服务包含繁重的处理,一种方法是让一个线程只进行处理,而通信线程通过一个共享队列为其提供信息;这就是我构建一个应用程序的方式,没有任何性能问题。或者,如果你真的担心创建线程,不要;只要让服务器连续处理消息,并在客户端无法连接时为客户端实施回退方案。谢谢你的建议,我无法理解你提到的关于端口监听套接字的警告,为什么其他手机不能连接到它?启动浏览器对我来说真的很麻烦!你能详细介绍一下你的经历吗?问题是网络没有初始化,只是因为监听是在套接字上启动的;这些手机(虽然这是几年前的事)在接入网络之前需要打开一个活动连接,因此即使插座正在监听,也无法连接到实际无线网络上的设备。但是,如果这击中了你(可能不会),你也可以,比如说,打开一个虚拟连接到你自己的IP地址;这应该是可行的,并且都在你的应用程序中。谢谢分享你的经验!