iOS + node.js使用Socket.IO框架进行实时通信示例
发布时间 - 2026-01-11 00:39:27 点击率:次Socket.IO是一个基于WebSocket的实时通信库,在主流平台都有很好的支持,此文主要是通过一个小例子来演示Socket.IO的使用。

基础环境搭建
新建一个文件夹(JS工程),创建一个package.json,复制以下内容并保存。
{
"name": "socket-chat-example",
"version": "0.0.1",
"description": "my first socket.io app",
"dependencies": {}
}
然后执行npm命令,安装我们需要的依赖(Express和Socket.IO), 请确保你电脑已经有node环境
在项目根目录也就是package.json所在的目录在终端执行以下命令
npm install --save express@4.10.2 npm install --save socket.io
进度条读完后会多这么一个文件夹,此时Express和Socket.IO就已经安装好了,这和iOS的Cocopods差不多,以模块化进行加载。
然后新建一个index.js作为服务端,再建一个index.html作为客户端。(为了方便演示,我这里有两个客户端,一个是iOS端,一个是浏览器端)
index.html
这也是官方Demo的演示界面,UI上没做修改
代码如下
<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font: 13px Helvetica, Arial; }
form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
</body>
</html>
index.js
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/',function(req,res){
res.sendfile(__dirname + '/index.html');
});
http.listen(3000,function () {
console.log('listien 3000');
});
开启了一个Server,监听3000端口,然后回到项目根目录,在终端输入node index.js
如果出现listen 3000则表明服务开启成功了,此时在浏览器访问http://localhost:3000 就能看到index.html页面了
iOS客户端的集成
新建一个iOS工程,在终端cd到项目根目录创建一个Podfile文件
vim Podfile
复制以下内容
use_frameworks! target 'SocketIO_Chat_Example' do #项目名 pod 'Socket.IO-Client-Swift', '~> 8.2.0' end
保存退出,执行命令安装依赖
pod install or pod install --verbose --no-repo-update
请确保已经有cocopods环境
iOS端的UI
使用Socket.IO
此时我们的客户端和服务端都已经有了Socket.IO的环境了,接下来就是使用它进行聊天了。
Socket.IO中事件的处理主要通过这两个方法来实现的
on(_ event: String, callback: NormalCallback) emit(_ event: String, _ items: AnyObject...)
on方法为接收事件的方法,emit为发送事件的方法
我们的需求是让浏览器和iOS客户端进行单聊
服务端的处理
要想发送到指定的客户端,需要知道当前客户端的id(Socket.IO的id,例:3t60BArlK47a2fA-AAAd),但是客户端并不清楚,客户端只知道我们自己定义的id,所以我们要将Socket.IO的Id和我们自己定义的id绑定并存储起来。
var socketArray = new Array();
io.on('connection', function(socket){
var islogin = false;
console.log('**********新加入了一个用户*********',socket.id);
socket.on('login',function (userId) {
if(islogin) return;
socket.userId = userId;
socketArray.push(socket);
islogin = true;
});
socket.on('privateMessage',function (data) {
console.log(data);
})
socket.on('chat message', function(data){
var to = data.toUser;
var message = data.message;
for(var i = 0;i<socketArray.length;i++){
var receiveData = socketArray[i];
if (receiveData.userId == to){
io.to([receiveData.socketId]).emit('privateMessage',''+receiveData.userId+':'+message);
}
}
});
socket.on('disconnect',function () {
console.log('***********用户退出登陆************,'+socket.id);
})
});
客户端的处理
浏览器的处理
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io();
socket.emit('login','30621');
$('form').submit(function(){
socket.emit('chat message',{'toUser':'30342','message':$('#m').val()} );
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
socket.on('privateMessage',function (msg) {
$('#messages').append($('<li>').text(msg));
});
</script>
iOS端的处理
iOS在初始化的时候需要一个config字典,config可以配置诸如log日志输出等设置
- (SocketIOClient *)client{
if (!_client) {
NSURL* url = [[NSURL alloc] initWithString:@"http://localhost:3000"];
_client = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
}
return _client;
}
- (void)connection{
[self.client on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"*************\n\niOS客户端上线\n\n*************");
[self.client emit:@"login" with:@[@"30342"]];
}];
[self.client on:@"chat message" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
if (event[0] && ![event[0] isEqualToString:@""]) {
[self.messageArray insertObject:event[0] atIndex:0];
[self.messageTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
}
}];
[self.client on:@"privateMessage" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
if (event[0] && ![event[0] isEqualToString:@""]) {
[self.messageArray insertObject:event[0] atIndex:0];
[self.messageTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
}
}];
[self.client on:@"disconnect" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
NSLog(@"*************\n\niOS客户端下线\n\n*************%@",event?event[0]:@"");
}];
[self.client on:@"error" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
NSLog(@"*************\n\n%@\n\n*************",event?event[0]:@"");
}];
[self.client connect];
}
//按钮点击事件
- (IBAction)sendMessage:(id)sender {
if (self.inputView.text.length>0) {
[self.client emit:@"chat message" with:@[@{@"toUser":@"30621",@"message":self.inputView.text}]];
[self.messageArray insertObject:self.inputView.text atIndex:0];
[self.messageTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
self.inputView.text = @"";
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# node
# socket.io
# nodejs
# ios
# 在Angular项目使用socket.io实现通信的方法
# Vue与Node.js通过socket.io通信的示例代码
# nodejs结合socket.io实现websocket通信功能的方法
# iOS 使用 socket 实现即时通信示例(非第三方库)
# 实时通信Socket io的使用示例详解
# 客户端
# 服务端
# 新建一个
# 创建一个
# 是一个
# 都有
# 很好
# 好了
# 就能
# 这两个
# 要想
# 只知道
# 要将
# 发送到
# 后会
# 已经有了
# 来实现
# 绑定
# 这和
# 此文
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何快速搭建高效WAP手机网站?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
如何挑选高效建站主机与优质域名?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
网站建设要注意的标准 促进网站用户好感度!
java中使用zxing批量生成二维码立牌
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel如何使用withoutEvents方法临时禁用模型事件
高端建站三要素:定制模板、企业官网与响应式设计优化
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Bootstrap CSS布局之列表
如何快速搭建支持数据库操作的智能建站平台?
BootStrap整体框架之基础布局组件
如何选择PHP开源工具快速搭建网站?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何在香港服务器上快速搭建免备案网站?
中国移动官方网站首页入口 中国移动官网网页登录
移动端脚本框架Hammer.js
如何选择可靠的免备案建站服务器?
浅谈Javascript中的Label语句
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
如何在服务器上三步完成建站并提升流量?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel如何创建自定义Facades?(详细步骤)
制作电商网页,电商供应链怎么做?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
,网页ppt怎么弄成自己的ppt?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
如何快速配置高效服务器建站软件?
长沙做网站要多少钱,长沙国安网络怎么样?
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel怎么使用Intervention Image库处理图片上传和缩放
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
零服务器AI建站解决方案:快速部署与云端平台低成本实践
在线制作视频的网站有哪些,电脑如何制作视频短片?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
如何在建站之星网店版论坛获取技术支持?
JS中对数组元素进行增删改移的方法总结

