iOS Socket.일

3515 단어

앞말


Socket.io는 WebSocket 프로토콜을 기반으로 하는 Socket 구성 요소입니다.이 구성 요소를 통해 우리는 Socket 연결을 바탕으로 하는 기능, 예를 들어 실시간 채팅, 탄막 등을 쉽게 실현할 수 있다.
동시에 소켓.io도 다중 플랫폼을 지원하며 iOS에서 Swift를 작성합니다.

인스턴스


소켓에서.io에는 각각 두 가지 방법이 있습니다. 제출과 감청입니다.이 두 가지 방법은 socket 통신에서 대응하는 것이 바로 일회용 데이터 전송이다.서버에서 온 메시지를 감청하고 로컬 클라이언트의 작업을 서버에 제출합니다.
  • 제출func emit(_ event: String, _ items: SocketData...)
  • 감청func on(_ event: String, callback: @escaping NormalCallback) -> UUID
  • 특정 이벤트를 감청하여 서버의 정보를 얻고 특정 이벤트를 제출하여 서버에 데이터를 제출합니다.특히 제출 데이터는 2진 데이터data, String, 심지어 사전까지 지원하는 범위가 매우 넓다.

    주의할 만한 구덩이

  • Objective-C와 Swift를 혼성할 때 초기화하는 데 필요한 config 매개 변수는 사전입니다. 사전 키는 자동으로 보완할 수 없습니다. 설정 가능한 키는 SocketIOClientOption 매거에 있습니다.
  •  /// Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity.
        /// If using Swift it's recommended to use `init(socketURL: NSURL, options: Set)`
        ///
        /// - parameter socketURL: The url of the socket.io server.
        /// - parameter config: The config for this socket.
        public convenience init(socketURL: NSURL, config: NSDictionary?) {
            self.init(socketURL: socketURL as URL, config: config?.toSocketConfiguration() ?? [])
        }
      // :
       SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"compress": @YES}];
    
  • 만약에 서버가 설정되어 있다면 초기화 매개 변수는 namespace 이고value는 nsp 로 시작해야 합니다.예: /.
  • 서버와의 권한 수여 검증에서 명문 토큰을 사용하면 토큰을 매개 변수로 서버에 제출할 수 있도록 설정해야 한다@"nsp":@"/chatroom".
  • Cookies 또는 Header에 인증된 경우 해당connectParamsextraHeaders을 설정할 수 있습니다.
  • 서버 URL에 Socket을 사용할 필요가 없습니다.io 접두사, 구성 요소 내부에서 자동으로 보완됩니다.서버 주소로 직접 설정하면 됩니다.
  • 감청 이벤트를 설정하려면 cookies 방법을 호출하기 전에 감청이 끝난 후에야 connect 방법을 호출할 수 있다.

  • 내가 만난 구덩이


    처음에 서버를 초기화하고 연결했는데 연결에 성공하지 못했습니다. 권한 수여가 성공하지 못했을 가능성이 있음을 초보적으로 인정하고 서버와 디버깅을 했습니다. 서버가 권한 수여를 닫는 방법을 발견한 후에 연결에 성공했지만 메시지를 받지 못했습니다.더 디버깅을 해보니 서버 설정의 Namespace에 들어가지 않았습니다. 최종적으로 Namespace의 설정에 문제가 있음을 확인했고 배열을 통해 Namespace 매개 변수의 맞춤법에 문제가 없음을 발견했습니다.마지막으로 원본 코드만 읽을 수 있고 iOS 플랫폼의 구성 요소가 연결될 때 nsp 파라미터를 사용하지 않아서 지정한 Namespace에 들어갈 수 없다는 것을 발견했다. 이것은 서버의 인증 검증이 지정한 Namespace에 놓여 있기 때문에 연결이 시작되고 지정한 Namespace에 들어가지 않아 인증이 통과되지 않고 연결이 성공할 수 없다는 것을 직접적으로 증명한다.
    해결 방법은 원본 코드만 바꾸는 것이다.
    open func engineDidOpen(reason: String) {
          // 
            if reason == "Connect" {
                joinNamespace(nsp)
            }
        //
            DefaultSocketLogger.Logger.log(reason, type: SocketIOClient.logType)
        }
    

    비록 변동은 크지 않지만, 처음부터 끝까지 원본을 읽고 해석하는 데는 많은 시간이 걸렸다.

    약간의 반성


    첫째, 많은 경우에 우리는 다른 사람이 만든 바퀴를 사용해야 한다. 이전에 나는 작가 코드의 질과 구성 요소의 보완 정도, 그리고 자신의 프로젝트와 적합한지 주목했다. 이곳의 적합성은 여러 가지 측면의 고려, 구성 요소의 유지보수성, 프로젝트에 대한 침입성, 결합성 등을 포함한다.하지만 이 바퀴에 선천적인 결함이 있는지 한 번도 생각해 본 적이 없다.선입견을 위주로 하는 사상은 자연스레 정부 구성 요소로서 틀림없이 문제가 없는 타당한 테스트를 거쳤다고 생각한다.이것은 나로 하여금 앞으로 구성 요소의 선택에 대해 더욱 신중하고 진지하게 이해하고 경계해야 하게 한다.
    둘째, 문제를 해결하는 과정에서 여러 차례 교착되어 한때 같은 통신 프로토콜을 기반으로 한 다른 구성 요소로 바꾸는 것을 포기하려고 했다.정서가 우리가 코드를 쓰고 디버깅하는 데 영향을 미칠 때가 많다. 문제에 부딪히면 냉정하고 논리적 절차를 재검토해야 한다.절대로 정서에 영향을 받아 당황해서는 안 된다.일시적으로 하던 일을 그만두고 몇 분 쉬고 심호흡을 하는 등 효과가 있다.
    셋째, 가장 발견하기 어려운 곳에 문제가 숨어 있는 경우가 많다. 특히 이번 정부의 원본 코드에 문제가 생겼다.요행을 바라지 말아야 한다.

    좋은 웹페이지 즐겨찾기