【问题标题】:SwiftSocket: Can't send more than one TCP messageSwiftSocket:不能发送多个 TCP 消息
【发布时间】:2017-03-07 10:45:01
【问题描述】:

我正在使用SwiftSocket 将 TCP 消息从我的 iPad 发送到本地设备。

第一条消息被正确接收,但当我尝试发送另一条消息时,我收到connectionTimeout 错误。

有什么想法吗?

Swift 3 代码:

func sendMessage(_ message: String) {
    self.client = TCPClient(address: "192.168.0.16", port: 7777)

    switch self.client.connect(timeout: 1) {
    case .success:
        switch self.client.send(string: "\(message)\n") {
        case .success:
            print("success")
        case .failure(let error):
            print("Sending error: \(error)")
        }

    case .failure(let error):
        print("Connection error: \(error)")
    }
}

在 CLI 中收听消息的代码:

nc -l 192.168.0.16 7777

【问题讨论】:

  • 通过套接字通信,套接字通常保持打开状态,您可以通过它发送多条消息。我猜另一端仍在监听您创建的第一个连接。我想你想把connect 方法从这里拉出来,并将打开的连接存储在一个属性中。否则每次都需要断开连接,效率不高。
  • @DaveWeston 我怎么没想到这个?这解决了我的问题,非常感谢!
  • @Skoua 嘿!我面临同样的问题,你想分享你的解决方案吗?谢谢!

标签: ios swift tcp network-programming


【解决方案1】:

试试这个课程

class SocketManager:  NSObject, StreamDelegate  {

     var serverAddress: CFString
     let serverPort: UInt32 = 6000

     private var inputStream: InputStream!
     private var outputStream: OutputStream!
     private var connecting:Bool

     init(ip:String) {
         serverAddress = ip as CFString
         connecting = false

         super.init()

         connect()
    }

    func disconect(){
       outputStream.close()
       inputStream.close()

   }
   func connect() {
       connecting = true

       while connecting {
          print("connecting...")

          var readStream:  Unmanaged<CFReadStream>?
          var writeStream: Unmanaged<CFWriteStream>?

          CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream)


          inputStream = readStream!.takeRetainedValue()
          outputStream = writeStream!.takeRetainedValue()

          inputStream.delegate = self
          outputStream.delegate = self

          inputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
          outputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

          inputStream.open()
          outputStream.open()


         connecting = false
      }
    }


    public func sendMsg(msg : String){

       let data = msg.data(using: String.Encoding.utf8)!
       // Write to output stream:
       _ = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }
    }
    public func Receive(){
       let bufferSize = 81600
       var buffer = Array<UInt8>(repeating: 0, count: bufferSize)

       let bytesRead = inputStream.read(&buffer, maxLength: bufferSize)
       if bytesRead >= 0 {
         let output = NSString(bytes: &buffer, length: bytesRead, encoding: String.Encoding.utf8.rawValue)
         DispatchQueue.global(qos: .background).async {
            GlobalFunction.GVsharedInstance.Parser(msg: output as! String)
         }
      }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2012-03-25
    • 2013-03-14
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多