2017-03-07 66 views
1

我使用SwiftSocket从我的iPad发送TCP报文到本地设备。被正确接收SwiftSocket:不能发送超过一个TCP消息

的第一条消息,但是当我尝试发送一个又一个,我得到一个connectionTimeout错误。

有什么想法?

斯威夫特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 
+1

随着socket通信,插座通常保持打开,你向下发送多个消息。我猜测另一端仍在监听您创建的第一个连接。我想你想拉'connect'方法离开这里,然后存储在属性中的开放连接。否则,您需要每次都断开连接,这不是非常有效。 –

+0

@DaveWeston我怎么就没有想到这一点?这解决了我的问题,非常感谢! – Skoua

+0

不客气! –

回答

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