我有兴趣学习Vapor,所以我决定在一个显示政府发布的天气警报的网站上工作。警报分发通过TCP / IP数据流(streaming1.naad-adna.pelmorex.com端口8080)完成。
我想到的是使用IBM的BlueSocket(https://github.com/IBM-Swift/BlueSocket)来创建一个套接字,虽然在这一点之后,我给了它一点思考,但是无法得出关于后续步骤的结论会的。
警报是通过数据流进行流式处理的,所以我知道套接字需要打开并收听,但是无法通过它。
数据流的一些内容是使用XML文档的开始和结束标记(警报和/警报)检测警报的开始和结束。没有向数据添加特殊或专有标头,它只是原始XML。我知道一些警报还包括XML声明,因此我假设如果声明可用,则应考虑编码。
然后我考虑使用XMLParser来解析XML并使用我感兴趣的数据来处理警报。
实际上,我正在努力解决的主要问题是,当套接字打开时,听取它的方法是什么,确定警报的开始和结束,然后传递XML警报以进行处理。
我很感激任何输入,我也不仅限于BlueSocket,所以如果我想要实现的目标有更好的选择,我将不仅仅是开放。
答案 0 :(得分:1)
所以,真正的,我正在努力的主要事情是,套接字是什么时候 打开,听取它的方法是什么,确定开始 并结束警报,然后传递该XML警报以进行处理。
您应该使用的方法是read(into data: inout Data)
。它存储服务器发送到data
的所有可用数据。 There are a few reasons for this method to fail,例如连接断开连接。
以下是如何使用它的示例:
import Foundation
import Socket
let s = try Socket.create()
try s.connect(to: "streaming1.naad-adna.pelmorex.com", port: 8080)
while true {
if try Socket.wait(for: [s], timeout: 0, waitForever: true) != nil {
var alert = Data()
try s.read(into: &alert)
if let message = String(data: alert, encoding: .ascii) {
print(message)
}
}
}
s.close()
IPv4 TCP Stream
。connect()
和hostname
向服务器发送port
秒。如果没有此步骤,则套接字未连接且无法接收或发送任何数据。wait()
直到hostname
向我们发送了一些数据。它返回一个包含可读数据的套接字列表。read()
数据,解码并打印。默认情况下,如果套接字上没有可用数据,则此调用将阻止。close()
套接字。这是一种很好的做法。您可能还想考虑一下:
read()
的单次调用可能无法提供完整警报)。我希望这能回答你的问题。