제47편: 서버와 클라이언트 간의 Socket 실시간 통신 실현
소개
Socket 실시간 통신 서버 및 클라이언트dome
사용 과정
node01 - socket 서버 구축.js
코드 주요 부분
서버
프로젝트에서 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(@"socket ,data = %@",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]];