监视TCP / IP流

时间:2018-04-12 23:03:15

标签: swift sockets tcp tcp-ip

我有兴趣学习Vapor,所以我决定在一个显示政府发布的天气警报的网站上工作。警报分发通过TCP / IP数据流(streaming1.naad-adna.pelmorex.com端口8080)完成。

我想到的是使用IBM的BlueSocket(https://github.com/IBM-Swift/BlueSocket)来创建一个套接字,虽然在这一点之后,我给了它一点思考,但是无法得出关于后续步骤的结论会的。

警报是通过数据流进行流式处理的,所以我知道套接字需要打开并收听,但是无法通过它。

数据流的一些内容是使用XML文档的开始和结束标记(警报和/警报)检测警报的开始和结束。没有向数据添加特殊或专有标头,它只是原始XML。我知道一些警报还包括XML声明,因此我假设如果声明可用,则应考虑编码。

然后我考虑使用XMLParser来解析XML并使用我感兴趣的数据来处理警报。

实际上,我正在努力解决的主要问题是,当套接字打开时,听取它的方法是什么,确定警报的开始和结束,然后传递XML警报以进行处理。

我很感激任何输入,我也不仅限于BlueSocket,所以如果我想要实现的目标有更好的选择,我将不仅仅是开放。

1 个答案:

答案 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()
  1. 首先创建套接字。默认值是我们想要的,IPv4 TCP Stream
  2. 使用connect()hostname向服务器发送port秒。如果没有此步骤,则套接字未连接且无法接收或发送任何数据。
  3. wait()直到hostname向我们发送了一些数据。它返回一个包含可读数据的套接字列表。
  4. read()数据,解码并打印。默认情况下,如果套接字上没有可用数据,则此调用将阻止。
  5. close()套接字。这是一种很好的做法。
  6. 您可能还想考虑一下:

    • non blocking sockets
    • 错误处理
    • 流式传输(对read()的单次调用可能无法提供完整警报)。

    我希望这能回答你的问题。