2016-07-06 63 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服務器,而不是一個應用程序。 –

相關問題