如何直接连接两部手机?

时间:2014-05-03 14:29:46

标签: android ios networking mobile

我经常在手机上使用聊天软件,如ICQ,MSN等。似乎这些软件都需要一个中央服务器来传递消息。它有点像星形拓扑。我想知道是否有一种方法可以在没有这种中央服务器的情况下将设备连接在一起。即一个真正的网络拓扑。

更新

我可能不会明白我的问题。我想知道是否有任何可以通过中央服务器连接电话的应用程序。也许以P2P方式进行沟通。

2 个答案:

答案 0 :(得分:3)

架构如下

每部手机都有一个SocketServer监听连接

每部手机都有一个BroadCastReceiver,可以监听数据连接的变化(如果是 连接丢失或创建)。

每部手机都可以创建套接字以与其他手机通信 具有client-id和client-ips

映射的服务器

现在基本流程如下

当客户端(电话)连接到互联网时,BroadcastReceiver会注意到此更改,并向服务器发送一条消息,告诉他他的ID和IP 服务器收到此消息并作为respone返回列表ID(其他已登录用户的ID)。

连接是通过java Sockets完成的,我构建了一个简单的协议,用于发送类似于http语法的params,消息有这种形式:

{添加my_id}:{} methodName中的param1 = VAL1&安培; param2的= val2的&安培; ...&安培; paramN = VALN

如果需要发送复杂对象,我使用GSon将param作为整个对象发送。

当客户端发送消息时,他必须指定发件人的ID。然后他向服务器询问id,然后服务器用ip回复(然后用一个简单的映射将此ip缓存在客户端中)。

服务器接收消息,然后通知任何MessageReceivedListeners

这样做的好处是:

不需要复杂的服务器:移动应用程序开发人员(像我一样)通常不希望在服务器端花费太多时间。 电话通常经常与移动网络连接和断开连接,因此通常需要重新建立连接的机制(在这种情况下,BroadcastReceiver是通知服务器他的IP已经改变而其他电话只询问服务器的人)

它是一个简单的协议,因此解析非常快,但如果需要,可以通过GSon发送复杂对象

它将问题分开:应用程序从不知道其他手机的IP,只知道他们的身份证,在我的情况下是用户的实际Facebook ID。

我之前在协议语法中提到的“methoName”使MessageReceivedListeners只接受一个“methodName”,因此它们只接收与它们相关的消息。

欢迎任何建议和评论

答案 1 :(得分:2)

当两个客户端落后于NAT时,几乎所有智能手机和常规PC(不是服务器或具有全局有效IP地址的设备)就是这种情况,如果没有第三个实体,它们就无法通信,而第三个实体将client_name映射到它#39 ;啜。 因此,从实际的角度来看,它无法使用IP寻址来实现。但其他解决方案可能是NFC和蓝牙,它们都是接近导向的。