2017-03-07 20 views
1

SwiftSocket私のiPadからローカルデバイスにTCPメッセージを送信するのに私はSwiftSocketを使用しています。SwiftSocket:複数のTCPメッセージを送信できません

最初のメッセージは正しく受信されましたが、別のメッセージを送信しようとするとconnectionTimeoutエラーが発生します。

スウィフト3コード:CLIで

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

コードのメッセージに耳を傾ける:

nc -l 192.168.0.16 7777 
+1

このクラスを試してみてください複数のメッセージを送信します。私はあなたが作成した最初の接続をまだ聞いています。私はあなたがここから '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) 
     } 
     } 
    } 
} 
関連する問題