제47편: 서버와 클라이언트 간의 Socket 실시간 통신 실현

소개

  • 본 Dome은 Socket 프레임워크를 바탕으로 하고 주요한 기능은 바로 실시간 통신 기능으로 방을 만들고 방에 있는 모든 클라이언트에게 메시지를 보내는 것이다. QQ군과 비슷하고 그룹의 인원수는'>'=2명이 방에 있을 수 있다

  • Socket 실시간 통신 서버 및 클라이언트dome

    사용 과정

  • 1, Socket 서버 시작
    node01 - socket 서버 구축.js
  • 2, socketClientDome 프로젝트를 열고 코드를 실행합니다..
  • 3. 페이지에 들어가면 사용자 이름을 임의로 입력한 후 로그인할 수 있습니다
  • 4. socket 클라이언트가 메시지를 보내고 서버와 통신하며 서비스가 되돌아오는 데이터(즉 다른 사람이 당신에게 되돌아오는 정보에 해당)를 감청한다

  • 코드 주요 부분


    서버


    프로젝트에서 socket을 다운로드해야 합니다.io 프레임 모듈


    cd는 지정한 항목이 있는 폴더로 가서 터미널에 node install socket을 입력하십시오.io – 다운로드 프레임워크 저장

    http 기반 Socket 서버 만들기

    //   http  
    var http = require('http');
    
    var server = http.createServer();
    
    //   socket  
    var socketIo = require('socket.io');
    //   socket   
    var serverSocket = socketIo(server);
    

    connection 이벤트 감청,clietSocket은 클라이언트의 socket

    serverSocket.on('connection',function listener(clietSocket){
        //  , 
    }
    

    클라이언트가 감청하는connection 이벤트에 데이터 보내기

    clietSocket.emit('connection',data);
    

    roomName이라는 방에 clietSocket을 추가합니다.

    //   room   roomName  
    //  ,   
    clietSocket.join(roomName);
    

    RoomName이라는 방의 모든 클라이언트에게 데이터 전송

    //   data  
    serverSocket.to(data.roomName).emit('chat',data);
    

    clientSocket 클라이언트가 roomName이라는 방을 떠납니다.

    //   data  
    clietSocket.leave(roomName);
    

    클라이언트


    cocoapods를 사용하여 Socket을 가져옵니다.IO-Client-Swift 인스턴트 메시징 등에 필요한 프레임워크

    use_frameworks!
    
    target 'socketClientDome' do
    
    pod 'Socket.IO-Client-Swift', '~> 11.1.0'
    
    pod 'JSQMessagesViewController', '~> 7.3.5'
    
    pod 'MJExtension', '~> 3.0.13'
    
    end
    

    QJSocketIOClient라는 분류 파일을 만들고 방법을 추가합니다.

    //   socketIOClient
    +(instancetype)shareSocketIOClient;
    
    //   socketIO
    -(void)connectWithSuccessBlock:(void(^)(NSArray * data))successBlock ;
    

    Socket 서버 연결

    //   Socket  
    [[SocketIOClient shareSocketIOClient] connectWithSuccessBlock:^(NSArray *data) {
    
    NSLog(@"socketdata = %@",data);
    
    }];
    

    서버에서 전송된 데이터를 감청하고 대응하는 방으로 이동

    //  , 
    //  : ,  callback   block  
    __weak typeof(self) weakSlef = self ;
    
    [[SocketIOClient shareSocketIOClient] on:@"joinRoom" callback:^(NSArray * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
    
    //  
    if (![data.firstObject isKindOfClass:[NSNull class]]) {
    weakSlef.chatDataArray = data.firstObject ;
    }
    
    //  
    [weakSlef jumpToMessagesVc];
    }];
    

    서버에 현재 클라이언트가 RoomName이라는 방에 들어갈 수 있음을 알려줍니다Name

    //  , 。  joinRoom  
    [[SocketIOClient shareSocketIOClient] emit:@"joinRoom" with:@[roomName]];
    

    다른 사람의 응답 정보를 감청하다

    // socket  
    __weak typeof(self) weakSlef = self ;
    
    [[SocketIOClient shareSocketIOClient] on:@"chat" callback:^(NSArray * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
    
    NSDictionary * keyValues = data.firstObject ;
    
    
    QJHandleMessageModel * model = [QJHandleMessageModel mj_objectWithKeyValues:keyValues];
    BOOL isCurrentUser = [model.senderId isEqualToString:weakSlef.userModel.userId];
    
    QJMessage * message = [QJMessage messageWithSenderId:model.senderId displayName:model.displayName text:model.text date:[weakSlef dateWithDateStr:model.dateStr] isCurrentUser:isCurrentUser];
    [weakSlef.messageDatas addObject:message];
    
    [weakSlef.collectionView reloadData];
    
    //  , , 
    [weakSlef finishReceivingMessageAnimated:YES];
    }];
    

    현재 사용자가 방에서 메시지를 보냅니다.

    //   , chat  ( )
    [[SocketIOClient shareSocketIOClient] emit:@"chat" with:@[keyValues]];
    

    좋은 웹페이지 즐겨찾기