2016-07-06 39 views
0

我正在Swift中构建一个HTTP服务器。服务器最终将在Linux上运行,但现在只能在Mac OS上编译。如何在Swift中检测套接字数据包的末尾

总之,我有套接字连接工作完美,我能够接收数据流,但我很难找到确定如何检测套接字数据流结束的最佳方式。

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

谢谢

+0

它没有任何与插座解决。它在HTTP协议中定义。您需要学习RFC 2616和后继,特别是关于内容和分块编码的部分。 – EJP

+0

我欣赏评论,并且我已经回顾了HTTP协议。我的问题就是那里使用的最好的技术。我了解基础知识,如标题是以冒号分隔的关键值,并且两条新行结束标题。我的问题是,处理这个问题时最好的办法是什么。 –

回答

0

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) 
    } 
} 

你的问题可以通过阅读()

+0

这可以在iOS或MacOS SDKs之外使用吗?这个项目是一个快速的服务器而不是应用程序。根据我的理解,用于普通jain Swift应用程序的Foundation库非常有限,并且尚未包含此实现。另外,这篇文章是Swift 3.0之前的版本,所以也许他们从那时起将它添加到规范中。 –

+0

不,这是一个应用程序 –

+0

然后,不幸的是你的答案是不适用的,因为在我上面的消息我声明这是一个Swift服务器,而不是一个应用程序。 –

相关问题