gpt4 book ai didi

swift - 如何在 Swift 中检测套接字数据包的结束

转载 作者:行者123 更新时间:2023-11-30 13:15:50 24 4
gpt4 key购买 nike

我正在 Swift 中构建一个 HTTP 服务器。该服务器最终将在 Linux 上运行,但目前只能在 Mac OS 上编译。

无论如何,我的套接字连接工作正常并且能够接收数据流,但是我很难找到确定如何检测套接字数据流结束的最佳方法。

我知道有很多方法可以做到这一点,而且我知道套接字基本上只是吐出纯二进制数据,并且没有具有开始和结束的“数据包”的概念。我的问题是,用于检测从请求网页的网络浏览器发送的数据包结束的最佳技术是什么?我知道对于 JSON 来说这非常简单,但我很好奇客户端何时专门请求网页。

谢谢

最佳答案

InputStream 为你做了这些,你不必关心它。

尝试使用这个:

import Foundation

typealias OnComing = (String) -> (Void)

class SocketClient: NSObject, StreamDelegate {

var host:String?
var port:Int?
var inputStream: InputStream?
var outputStream: OutputStream?

var status = false;
var output = ""
var bufferSize = 1024;

var onComing:OnComing!

func makeCFStreamConnection(host: String, port: Int, onComing:@escaping OnComing) {

self.host = host
self.port = port
self.onComing = onComing

Stream.getStreamsToHost(withName: host, port: port, inputStream: &self.inputStream, outputStream: &self.outputStream)

if self.inputStream != nil && self.outputStream != nil {

self.inputStream!.delegate = self
self.outputStream!.delegate = self

self.inputStream!.schedule(in: .main, forMode: RunLoopMode.defaultRunLoopMode)
self.outputStream!.schedule(in: .main, forMode: RunLoopMode.defaultRunLoopMode)

self.inputStream!.open()
self.outputStream!.open()

}


}

func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
if aStream === self.inputStream {
switch eventCode {
case Stream.Event.errorOccurred:
break
case Stream.Event.openCompleted:
break
case Stream.Event.hasBytesAvailable:
break
read()
default:
break
}
} else if aStream === self.outputStream {
switch eventCode {
case Stream.Event.errorOccurred:
break
case Stream.Event.openCompleted:
break
case Stream.Event.hasSpaceAvailable:
break
default:
break
}
}
}

func read() {
var buffer = [UInt8](repeating: 0, count: bufferSize)
while (self.inputStream!.hasBytesAvailable) {
let bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count)
if bytesRead >= 0 {
output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding: String.Encoding.ascii.rawValue)! as String
} else {
print("# Stream read() error")
}
}
self.onComing(output)
}

func write(message:String) {
let encodedDataArray = [UInt8]("\(message)\n".utf8)
self.outputStream?.write(encodedDataArray, maxLength: encodedDataArray.count)
}
}

您的问题已通过 read() 解决

关于swift - 如何在 Swift 中检测套接字数据包的结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com