Tag: WebSocket

在Mac App上测试Phoenix频道

在Coletiv的当前项目之一中,我们需要不断保持数据在多个移动设备之间的同步。 我们想到的使状态保持最新的第一个解决方案是每分钟与推送通知相关的服务器轮询服务器。 显然,就性能和可靠性而言,这并不是最佳的解决方案。 由于我们的后端是使用Phoenix制造的,因此最初的天真解决方案自然就演变为使用Phoenix Channels。 在本文中,我们将介绍我们使用游戏“史莱姆足球”实现概念验证以测试Phoenix Channel的经验。 对于两个玩家来说,这是一个简单的游戏,每个人控制一个粘液,目标是进球。 概念证明已在Swift中作为Mac应用程序实现,但可以轻松地以您选择的任何其他语言或平台实现。 这个想法是让游戏的两个实例在不同的计算机上运行,​​每个实例都将通过Phoenix频道连接到Phoenix服务器。 服务器负责管理游戏得分并处理两个玩家之间的通信。 有几个Swift开源项目可以帮助进行渠道沟通: PhoenixWebSocket 鸟鸣 Swift Phoenix客户 我们之所以选择使用Birdsong,只是因为我们认为目前最适合我们需求的项目。 它具有简洁的代码样式,对服务器执行定期ping操作,并允许进行一些自定义操作,例如处理断开操作。 如果要继续学习,可以在此处找到服务器源代码,在此处找到客户端源代码。 下图描述了游戏过程中Mac客户端与服务器之间的一般通信流程。 服务器 要在Phoenix中定义一个新通道,我们只需将此行添加到UserSocket.ex中: 频道(“游戏:*”,SuperSlimeGameWeb.GameChannel) 我们的连接功能非常简单,因为我们选择忽略身份验证步骤,因为这将意味着需要进一步的开发,而这并不是我们进行此测试的目标,但是如果您需要身份验证,则可以在此进行检查。 客户 在connect方法中,我们定义了onConnect和onDisconnect处理程序。 连接/断开套接字后,将调用这些闭包。 在我们的测试中,我们将在连接套接字后立即加入通道。 当插座断开连接时,将在短暂的延迟后执行重新连接。 服务器 该应用程序的主要部分是加入功能,玩家可以在其中加入游戏。 信道术语和有效载荷结构定义如下: 通道命名 “游戏:” 代码 有效载荷结构 %{“电子邮件” =>电子邮件} 游戏代码game:[a_code]用于检查游戏是否已经存在于为管理游戏而创建的GameState代理进程中。 如果游戏已经存在,我们将添加通过有效负载结构传递的新玩家,否则将创建新游戏并添加新玩家。 GameState代理用于保存游戏和比赛玩家,它作为受监督的子进程与服务器一起启动。 要启动代理,将工作器添加到Application.ex中,如下所示: 工作者(SuperSlimeGame.GameState,[]) 游戏状态代理实施 客户 在join方法中,我们定义了通道事件监听器。 如果从通道返回了特定的操作(即播放器已移动),则将执行这些侦听器。 验证套接字的状态以确保维持连接的持久性很重要。 服务器 收到playerAction命令后,服务器会将其广播给所有加入该频道的播放器。 客户 每次更新场景时,都会向通道发送一条消息,其中包含本地玩家的坐标和动作。 身份验证方法-连接与连接 在此示例中,我们没有在通道连接中添加任何安全性,但这在现实环境中是必须具有的。 在Coletiv开发的其他项目中,我们需要验证用户身份以允许其访问其资源。 […]

使用Swift的iOS中的Websocket

WebSocket允许极其快速的双向网络通信,这使您可以更快,更频繁地发送和接收更新,更不用说安全了。 WebSocket是一种使用套接字的通信协议,可通过单个TCP连接提供双工通信。 它由IETF于2011年标准化,是与HTTP不同的协议。 WebSockets广泛用于聊天应用程序,流实时通知和股票价格中。 Websocket生命周期 与服务器握手 握手应用程序是WebSockets中的Web部件。 这是从HTTP到WebSocket的桥梁。 客户端向服务器发送一个非常标准的HTTP GET请求: GET / chat HTTP / 1.1 主持人:example.com:8000 升级:websocket 连接:升级 Sec-WebSocket-密钥:dGhlIHNhbXBsZSBub25jZQ == 安全WebSocket版本:1 这里最有趣的是`Sec-WebSocket-Key`,出于安全原因,它是根据WebSocket标准生成的。 服务器验证请求,如果一切正常,则发送回HTTP响应: HTTP / 1.1 101交换协议 升级:websocket 连接:升级 Sec-WebSocket-接受:s3pPLMBiTxaQ9kYGzzhZRbK + xOo = 交流信息 服务器或客户端可以随时发送遵循以下特定格式的数据: 我不会详细介绍每个部分,但是您可以在标准中找到更多信息。 乒乓球 客户端或服务器在任何时候都可以发送ping,而另一方必须发送回pong。 闭幕 任何一方都可以通过发送指定的控制序列来关闭连接。 在iOS中实现WebSockets 在iOS,macOS,tvOS或watchOS中实现WebSocket并非易事。 新的Network.framework可以简化此操作,但是您仍然需要处理基础任务,例如升级连接和设置WebSocket框架。 红蜘蛛 Swift WebSocket客户端库Startscream简化了所有繁重的任务。 安装该库并将其导入任何Swift文件中。 进口红蜘蛛 建立连接 之后,创建一个连接并设置委托。 套接字= WebSocket(URL:URL(字符串:“ ws:echo.websocket.org”)!) socket.delegate […]

websocket只是专门用于浏览器

我正在尝试使用第三方库编程本机Objective-C和本机Android应用程序。 我已经select了图书馆,而且我已经在进步了。 我的团队中有一个人认为,websocket目前正在专注于Web浏览器,如果我们使用这个第三方库来实现本地应用程序,它可能并不稳定。 他说,保持本地移动应用程序的websocket连接可能是微不足道的,但webkit浏览器已经这样做了,所以我们应该考虑创build一个hybrod应用程序。 任何人都可以对此发表评论吗?

在Safari上推送通知的策略

我正在努力实现需要发送推送通知的PWA,我们正在寻找一种解决scheme,将推送通知发送到运行在ios上的浏览器(我们正在使用Firebase(FCM)来完成其他任务)。在所有平台上推送通知,包括ios? 我们正在嗅探用户代理,并将FCM用于非ios用户,切换到ios用户的websockets。 我们不确定这种方法会有多可行。 任何build议,这种方法或更好的select会有很大的帮助!

videostream在Websockets

我正在尝试构build移动应用程序,可以从两边传输video(即video通话等)。 我看着webrtc,但还没有准备好移动原生应用程序,反正webrtc正在做的是让浏览器直接捕获相机和audio,而不需要插件等。但在原生移动应用程序捕捉相机和audio不是一个问题基本上需要非常低的延迟和双重传输层。 在很多文章和地方,我读到关于使用WebSocket的websocket。 所以我想我可以使用websocketsstream式传输video。 这是正确的还是我错过了什么? 我知道有一个更多的差异,webrtc直接客户端到客户端…而websocket将客户端服务器客户端,有无论如何,以避免它。 那这意味着什么延迟的条件。

我的IOS上的Socket.io无法与websocket服务器握手

我有一个运行WebSocket的Node.js服务器。 (使用柚子)。 我能够运行一个Web应用程序并连接到它(localhost @port 3104)。 但是,当我尝试使用socket.io(SocketRocket)的IOS和连接到相同的本地主机和端口,我得到这个错误: > http://127.0.0.1:3014/socket.io/1/?t=16807 > "ERROR: handshake failed … The request timed out" 错误的细节: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x6c723c0 {NSErrorFailingURLStringKey=http://127.0.0.1:3014/socket.io/1/?t=16807, NSErrorFailingURLKey=http://127.0.0.1:3014/socket.io/1/?t=16807, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x6c72400 "The request timed out."} 我试过了。 127.0.01,本地主机…甚至明确的IP地址..都失败 任何想法我应该检查? 并应该是“http”协议? 或者wss?

在iOS上与Icecast服务器打开套接字连接

我正在尝试为iOS上的Icecast服务器创build源客户端。 我相信我理解这里的协议Icecast 2:协议描述,使用C# 但是,我无法创build到服务器的套接字连接。 假设服务器在http://myicecastserver.com上的8000端口上运行。 我设置了一个名为stream的安装点,它在ezstream用作input时起作用。 我应该如何从iOS打开连接? 我已经使用这样的AsyncSocket库: [socket connectToHost:@"http://myicecastserver.com" onPort:8000 error:&err]; 喜欢这个: [socket connectToHost:@"http://myicecastserver.com/stream" onPort:8000 error:&err]; 无济于事。 我也尝试使用与SocketRocket的websocket连接也无济于事: SRWebSocket *socket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:@"http://myicecastserver.com:8000/stream"]]; [socket setDelegate:self]; [socket open]; 这给了我一个404错误 我已经尝试了一些这方面的变化,但只是无法打开这个连接来挽救我的生命! 谢谢! UPDATE 我使用SocketTest作为testing源客户端,并且能够在端口8000上连接到http://myicecastserver.com

websocket安全性需要改变iOS 10的兼容性

我们有一个在iOS 9上运行良好的iOS Cordova应用程序,但是在iOS 10上产生安全错误,例如Websocket注册错误,操作是不安全的。 苹果有哪些安全要求更改/添加? 对于wss://和ws://更改为CSP,则需要内容安全策略。 谢谢

通过xmpp或websocket进行即时通讯

我有项目要求,我想在android / iphone中做一个即时通讯应用程序,并可能在未来它支持voip和video聊天。 现在我有2个select 1)xmpp – 即时通讯的应用层协议,已经有近10年的历史了,它有很多支持voip的扩展,或者可以是video聊天,在线/离线状态和其他许多function。 它被诸如whatsapp,fb,Skype等大公司所接受 另外我听说谷歌已经摆脱了这个协议,因为漏洞。 2)websocket – 它是tcp层协议,它通过一个单独的tcp连接提供全双工通信,它是新的,在2011年被IETF标准化。我不知道这个协议是否主要用于IM。 但是我知道它可以像在tcp层一样完成。 我没有看到或听到任何function/扩展的networking套接字除了4种方法(即onOpen,onClose,onMessage和onError)。 所以这意味着如果我select这个,我必须使自己的在线/离线状态的方法(可能是每“x”秒/分钟)发送一帧,voip,消息传递信息和其他function等。 我很困惑,从开发,服务器处理成本,安全性,会话处理pipe理,浏览器支持等方面来说,我selectxmpp还是web socket。 如果我对这两个协议有任何错误,请纠正我。 提前致谢

无法使用自定义CA打开安全websocket

我正在编写一个使用socket.io( socket.io-objc库)连接到本地和远程服务器的iOS应用程序。 我与远程服务器的连接已经使用TLS,没有任何问题。 远程服务器具有由知名CA签名的证书。 现在我想要保护本地连接。 但是,这些本地证书不可能由知名的CA签名。 到目前为止,我已经生成了一个自定义的CA证书,并用它来签署本地服务器的证书。 我相信这是工作,因为如果我手动安装CA证书到我的iPad我能够连接到服务器。 现在我试图在使用本文的应用程序中自动安装CA证书作为参考。 我遇到的问题是,虽然看起来我可以成功地将证书添加到我的应用程序的钥匙串中,但我的套接字连接似乎没有使用它。 在启动时,我的应用程序安装CA: NSBundle *bundle = [NSBundle bundleForClass:[self class]]; NSData *iosTrustedCertDerData = [NSData dataWithContentsOfFile:[bundle pathForResource:@"myRootCA" ofType:@"der"]]; SecCertificateRef certificate = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef) iosTrustedCertDerData); CFDictionaryRef dict = (__bridge CFDictionaryRef)([NSDictionary dictionaryWithObjectsAndKeys: (__bridge id) (kSecClassCertificate), kSecClass, certificate, kSecValueRef, nil]); OSStatus err = SecItemAdd(dict, NULL); if (err == noErr) { NSLog(@"####### […]