Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何直接连接两部手机?_Android_Ios_Networking_Mobile - Fatal编程技术网

Android 如何直接连接两部手机?

Android 如何直接连接两部手机?,android,ios,networking,mobile,Android,Ios,Networking,Mobile,我经常在手机上使用聊天软件,如ICQ、MSN等。这些软件似乎都需要一个中央服务器来转发信息。它有点像一个星形拓扑。我想知道是否有一种方法可以在没有中央服务器的情况下将设备连接在一起。即真正的网络拓扑 使现代化 我可能没有把我的问题说清楚。我想知道是否有任何应用程序可以连接电话,而无需通过中央服务器。可能是通过P2P方式进行通信。架构如下 每部手机都有一个SocketServer来监听连接 每部手机都有一个广播接收器,可以监听数据连接的变化(如果 连接丢失或已创建) 每部手机都可以创建与其他手机通

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

使现代化
我可能没有把我的问题说清楚。我想知道是否有任何应用程序可以连接电话,而无需通过中央服务器。可能是通过P2P方式进行通信。

架构如下

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

每部手机都有一个广播接收器,可以监听数据连接的变化(如果 连接丢失或已创建)

每部手机都可以创建与其他手机通信的插孔 具有客户端ID和客户端IP映射的服务器

现在基本流程如下

当客户端(电话)连接到internet时,BroadcastReceiver会注意到这一变化,并向服务器发送消息,告知其ID和IP 服务器收到此消息并作为响应返回一个列表ID(其他登录用户的ID)

连接是通过vía java Sockets完成的,我构建了一个简单的协议,用于发送类似于http语法的参数,消息的形式如下:

{my_id}:{methodName}?param1=val1¶m2=val2&……¶mN=valN

如果需要发送一个复杂的对象,我将使用GSon作为一个整体对象发送一个参数

当客户端发送消息时,他必须指定发送者的id。然后他向服务器请求id,然后服务器用ip进行回复(然后通过简单的映射将该ip缓存在客户端中)

该消息由服务器接收,然后服务器通知所有MessageReceivedListeners

这样做的好处是:

不需要复杂的服务器:移动应用程序开发人员(比如我)通常不想在服务器端花费太多时间。 手机通常经常与移动网络连接或断开连接,因此通常需要一种重新建立连接的机制(在这种情况下,广播接收器是通知服务器其IP已更改,而其他手机只是询问服务器)

这是一个简单的协议,因此解析速度相当快,但如果需要,可以通过GSon发送复杂的对象

它将关注点分开:应用程序永远不知道其他手机的IP,只知道它们的id,在我的例子中,它们是用户的实际Facebook id

我前面在协议语法中提到的“methodName”使MessageReceivedListeners只能使用一个“methodName”,因此它们只接收与其相关的消息


任何建议和批评都是受欢迎的

当两个客户端都支持NAT时,这几乎适用于所有智能手机和普通PC(不是具有全球有效ip地址的服务器或设备),如果没有第三个实体,他们就无法进行通信,第三个实体将客户端名称映射到其ip。
因此,从实用的角度来看,它不能用IP地址实现。但其他解决方案可能是NFC和蓝牙,它们都是面向接近的。

您尝试过蓝牙吗?我觉得这听起来像是常规的TCP。也许我这里遗漏了什么。我知道Bluetooth,但距离太近了。你可以使用
蓝牙
。但除此之外,使用服务器几乎是不可避免的。如果你想通过互联网连接,你必须知道你想联系的电话的IP。要找到IP,你需要某种服务器,手机可以在那里注册IP。例如,Skype就是这样工作的,但Skype也使用了许多其他的伎俩,而且它们处理P2P连接的方式非常复杂。大多数其他应用程序通过服务器转发这些消息,因为这要简单得多。你可以调查一下。