SwiftUI에서 Socket Library 사용하기

반응형
728x90
반응형
 
 
 
Introduction

이번 포스팅은 Socket을 이용하는 방법에 대해 작성합니다. 네트워크 연결을 위해 socket.io 및 기타 다른 라이브러리도 많이 있지만, 기존에 개발된 모듈들이 대부분 TCP/UDP socket으로 구현되어 있습니다. 이를 위해, 동일한 모듈을 이용하여 개발을 하는 것지 좋지 않을까 생각되어 개발을 시작하였죠. 다른 포스팅에 작성하겠지만, 한글이 들어간 packet에 대해서는 전달이 불분명하게 되어있어, 더 이상 사용하지 않는 것이 좋다고 생각합니다. 대신, socket.io를 이용할 경우 데이터를 주고 받는 부분에는 문제가 없습으니 참고 바랍니다. 
포스팅은 그외, 게임등 다른 이유로 필요한 분들이 계시지 않을까 싶어 포스팅 해두려고 합니다. 그럼하나씩 살펴보도록 할까요? 
 

 

 

 
 
SwiftSocket Install

 
 
상위 링크 두곳 다 같은 곳으로서 편한곳에서 다운 받아서 사용하시면 됩니다. 
 
 
cocoapods을 이용할 경우, 다음과 같이 이용가능 합니다. 
pod ’SwiftSocket'
cocoapods 설치 및 사용방법은 따로 포스팅을 해두었으니 참고 바랍니다. 
 
설치를 완료하면 이제 오류 수정을 하도록 하겠습니다. 
 
 
Build Error 

  • Error
    • SWIFT_VERSION '3' is unsupported, supported versions are: 4.0, 4.2, 5.0.
 
위와 같은 빌드가 오류가 날 경우 해결방법은 다음과 같음. 
 
  • Targets>SwiftSocket을 선택
  • Build & setting 선택
  • “Swift” 검색
  • Swift Compiler - Language > Swift Language Version >
    • Swift3 -> Swift 5로 변경 ( 4.0, 4.2 등으로 사용 가능)
  • Cmd + B를 눌러서 rebuild 수행 
 

 

 

 
 
swiftSocketEx.swift

이제 샘플 코드를 이용하여 다음과 같이 코드를 작성합니다. 
import Foundation
import SwiftSocket

public typealias Byte = UInt8

class SwiftSockMine {
    
    // singleton
    static let mInstance = SwiftSockMine()
    private init() {
        self.addr = "127.0.0.1"
        self.port = Int32(1234)
    }

    var addr:String?
    var port:Int32?
    var client: TCPClient?
    
    
    func InitSock(address:String, portNum:Int32) {
        self.addr = address
        self.port = portNum
        client = TCPClient(address: address, port: Int32(portNum))
        // Connect()
    }

    func sendMessage(msg:String) {
       guard let client = client else { return }
       
       switch client.connect(timeout: 10) {
       case .success:
         appendToTextField(string: "Connected to host \(client.address)")
         let newMsg:String = msg +  "\n\n"
         
         if let response = sendRequest(string: newMsg, using: client) {
           appendToTextField(string: "Response: \(response)")
         }
        
       case .failure(let error):
         appendToTextField(string: String(describing: error))
       }
     }
    

    private func sendRequest(string: String, using client: TCPClient) -> String? {
      appendToTextField(string: "Sending data ... ")
      
      switch client.send(string: string) {
      case .success:
        print("success: ")
        return readResponse(from: client)
      case .failure(let error):
        print("failure: ")
        appendToTextField(string: String(describing: error))
        return nil
      }
    }
    
    private func readResponse(from client: TCPClient) -> String? {
      guard let response = client.read(1024*10) else { return nil }
      print(response)
      return String(bytes: response, encoding: .utf8)
    }
    
    private func appendToTextField(string: String) {
      print(string)
      //textView.text = textView.text.appending("\n\(string)")
    }
}

public enum SocketError: Error {
    case queryFailed
    case connectionClosed
    case connectionTimeout
    case unknownError
}
 
 
이후 contents View.swift 에는 다음과 같이 추가 하시면 됩니다.
print("pushed the Button: 전송: " + self.txtMsg+"\n\n")
mysock.InitSock(address: "127.0.0.1", portNum: 1234)
var sendMsg:String = "테스트"
mysock.sendMessage(msg: sendMsg)
간단하죠? 

 

서버는 C/C++ 기반에서 작성한 코드를 이용하였습니다. 이후 필요에 따라 packet 형태로 구성하여 작성하면 좋을 것 같네요. 그리고 시간이 되면 직접 작성한 코드를 swift로 옮기도록 해야겠네요… 
728x90
반응형

댓글

Designed by JB FACTORY