监控 TCP/IP 流
Monitor TCP/IP stream
我对学习 Vapor 很感兴趣,所以我决定在一个显示政府发布的天气警报的网站上工作。警报分发是通过 TCP/IP 数据流(streaming1.naad-adna.pelmorex.com 端口 8080)完成的。
我的想法是使用IBM的BlueSocket(https://github.com/IBM-Swift/BlueSocket)来创建一个套接字,虽然在这一点之后,我想了一下但无法得出结论接下来的步骤是。
警报通过数据流传输,因此我知道需要打开并监听套接字,但无法做到这一点。
数据流的一些事情是使用 XML 文档(alert 和 /alert)的开始和结束标记检测警报的开始和结束。数据中没有添加任何特殊或专有的 headers,它只是原始的 XML。我知道一些警报还包含一个 XML 声明,因此我假设如果声明可用,则应考虑编码。
然后我在考虑使用 XMLParser 来解析 XML 并使用警报中我感兴趣的数据。
所以真的,我遇到的主要问题是,当套接字打开时,监听它的方法是什么,确定警报的开始和结束,然后传递 XML处理警报。
我将不胜感激任何意见,我也不限于 BlueSocket,所以如果有更好的选择来实现我想要实现的目标,我会非常乐意接受。
So really, the main thing I am struggling with is, when the socket is
open, what would be the method to listen to it, determine the start
and end of the alert and then pass that XML alert for processing.
您应该使用的方法是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
向我们发送了一些数据。它 returns 具有可读取数据的套接字列表。
read()
数据,解码并打印。默认情况下,如果套接字上没有可用数据,此调用将阻塞。
close()
插座。这是很好的做法。
您可能还想考虑考虑:
- non blocking sockets
- 错误处理
- 流式传输(对
read()
的一次调用可能不会给出完整的警报)。
我希望这能回答你的问题。
我对学习 Vapor 很感兴趣,所以我决定在一个显示政府发布的天气警报的网站上工作。警报分发是通过 TCP/IP 数据流(streaming1.naad-adna.pelmorex.com 端口 8080)完成的。
我的想法是使用IBM的BlueSocket(https://github.com/IBM-Swift/BlueSocket)来创建一个套接字,虽然在这一点之后,我想了一下但无法得出结论接下来的步骤是。
警报通过数据流传输,因此我知道需要打开并监听套接字,但无法做到这一点。
数据流的一些事情是使用 XML 文档(alert 和 /alert)的开始和结束标记检测警报的开始和结束。数据中没有添加任何特殊或专有的 headers,它只是原始的 XML。我知道一些警报还包含一个 XML 声明,因此我假设如果声明可用,则应考虑编码。
然后我在考虑使用 XMLParser 来解析 XML 并使用警报中我感兴趣的数据。
所以真的,我遇到的主要问题是,当套接字打开时,监听它的方法是什么,确定警报的开始和结束,然后传递 XML处理警报。
我将不胜感激任何意见,我也不限于 BlueSocket,所以如果有更好的选择来实现我想要实现的目标,我会非常乐意接受。
So really, the main thing I am struggling with is, when the socket is open, what would be the method to listen to it, determine the start and end of the alert and then pass that XML alert for processing.
您应该使用的方法是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
向我们发送了一些数据。它 returns 具有可读取数据的套接字列表。read()
数据,解码并打印。默认情况下,如果套接字上没有可用数据,此调用将阻塞。close()
插座。这是很好的做法。
您可能还想考虑考虑:
- non blocking sockets
- 错误处理
- 流式传输(对
read()
的一次调用可能不会给出完整的警报)。
我希望这能回答你的问题。