第四十七篇:实现 服务端 与 客户端 之间 Socket 即时通讯

简介

  • 本 Dome 基于 Socket框架, 主要的功能就是即时通讯功能,创建房间,并与发送信息给所有在房间内的客户端,与QQ群相似,群的人数可以是’>’=2个人在房间内。

Socket 即时通讯的 服务端 与 客户端 dome

使用过程

  • 1、启动 Socket 服务器

    node 01-搭建socket服务器.js

  • 2、打开 socketClientDome 工程,并运行代码。

  • 3、进入页面后,可以任意输入一个用户名字,然后进行登录

  • 4、socket 客户端 发送信息,与服务器通信,并监听服务返回的数据(即相当于他人给你回的信息)

代码主要部份

服务端

需要在项目中下载 socket.io 框架模块

cd 到指定项目所在的文件夹 , 然后在终端输入 node install socket.io –save 下载框架

创建 基于 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);

把 clietSocket 加入到名为 roomName 的房间

// 把当前的客户端添加到 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

创建 SocketIOClient 分类名为 QJSocket 的文件,添加一些方法

// 创建 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 的房间

// 进入房间告知服务器,好让服务器处理数据。服务器会给当前客户端通过事件 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]];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。 2、首先运行服务器端工程,选默认的端口1008 3、然后运行客户端工程,选默认的端口1008和默认的服务器地址 4、再运行多个客户端进程 5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息 实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket实现了C++的网络通讯编程功能。 本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。 参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。 阅读对象:具有Java的Socket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值