2017-03-07 3 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

을 시도, 소켓은 일반적으로 열려하고 여러 개의 메시지를 보내십시오. 다른 쪽 끝은 당신이 만든 첫 번째 연결을 계속 듣고있는 것 같습니다. 나는 당신이 여기에서'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) 
     } 
     } 
    } 
} 
관련 문제