2017-03-07 5 views
1

Ich verwende SwiftSocket, um TCP-Nachrichten von meinem iPad an ein lokales Gerät zu senden.SwiftSocket: Kann nicht mehr als eine TCP-Nachricht senden

Erste Nachricht wird korrekt empfangen, aber wenn ich versuche, eine andere Nachricht zu senden, erhalte ich einen connectionTimeout Fehler.

Irgendeine Idee?

Swift 3-Code:

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

-Code in CLI, um Nachrichten abzuhören:

nc -l 192.168.0.16 7777 
+1

Mit Socket-Kommunikation, die Fassung bleibt in der Regel offen und Sie sende mehrere Nachrichten herunter. Ich schätze, das andere Ende hört immer noch auf die erste Verbindung, die Sie erstellt haben. Ich denke, du willst die 'connect'-Methode hier herausziehen und die offene Verbindung in einer Eigenschaft speichern. Andernfalls müssen Sie jedes Mal trennen, was nicht sehr effizient ist. –

+0

@DaveWeston Wieso habe ich nicht daran gedacht? Das hat mein Problem behoben, vielen Dank! – Skoua

+0

Gern geschehen! –

Antwort

1

diese Klasse Versuchen

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