socket服务端的实现

socket是用来让浏览器和服务器进行实时通讯的。以前通常使用定时轮询的方式来模拟实时通讯,但这样做无疑是增加了服务器的压力。

下面是搜集的socket.io的一些用法:

服务端部分

io.on(‘connection’,function(socket));//监听客户端连接,回调函数会传递本次连接的socket

io.sockets.emit(‘String’,data);//给所有客户端广播消息

io.sockets.socket(socketid).emit(‘String’, data);//给指定的客户端发送消息

socket.on(‘String’,function(data));//监听客户端发送的信息

socket.emit(‘String’, data);//给该socket的客户端发送消息

发送消息

//给除了自己以外的客户端广播消息
socket.broadcast.emit("msg",{data:"hello,everyone"});
//给所有客户端广播消息
io.sockets.emit("msg",{data:"hello,all"});

分组和分组发送消息

socket.on(‘group1‘, function (data) {
        socket.join(‘group1‘);
});
socket.emit(‘group1’) //加入group1分组;
//移出分组
socket.leave(data.room);
//分组发送消息-不包括自己
socket.broadcast.to(‘group1‘).emit(‘event_name‘, data);
//分组发送消息-包括自己
io.sockets.in(‘group1‘).emit(‘event_name‘, data)

客户端

//建立一个socket连接

var socket = io(“ws://103.31.201.154:5555”);

//监听服务消息

socket.on(‘msg‘,function(data){
    socket.emit(‘msg‘, {rp:"fine,thank you"}); //向服务器发送消息
    console.log(data);
});
socket.on(“String”,function(data)) //监听服务端发送的消息 Sting参数与服务端emit第一个参数相同

//监听socket断开与重连。

socket.on(‘disconnect‘, function() {
    console.log("与服务其断开");
});

项目代码部分:

项目中用到的功能都很简单,最主要的无非就是进入房间、退出房间、然后发送信息这些功能。

var io = require(‘socket.io‘)();
var xssEscape = require(‘xss-escape‘);
var userList = []; //用户列表
//var currentRoom = []//用于存放当前连接用户在哪个房间的集合;
io.on(‘connection‘, function (socket) { //监听连接事件,并同时监听下面四个事件
    joinRoom(socket);
    disconnect(socket);
    say(socket);
    close(socket);
});

//进入房间
function joinRoom(socket) {
    socket.on(‘joinRoom‘, function (userInfo) {
        socket.join(userInfo.roomId); //将当前连接的用户添加到指定的roomid房间的socket中
        socket.userInfo = userInfo; //为这个socket添加一个用户属性
        userList[socket.id] = userInfo;//在用户列表中,存放当前用户的信息,因为socket是唯一的
        socket.emit(‘userList‘, getUserNameList(socket));//向自己传回当前房间的用户列表 to(socket.userInfo.roomId).
        socket.broadcast.to(socket.userInfo.roomId).emit(‘userJoin‘, {
            userId: userInfo.userId,
            nickName: userInfo.nickName,
            socketId: socket.id
        }); //通知其他用户有人进入房间
        socket.emit(‘serverMessage‘, ‘欢迎进入房间!‘); //当进入房间成功之后,向用户发送一个欢迎信息。
        socket.emit("test","test");
    })
}
//获取当前房间用户列表
function getUserNameList(socket) {
    var nameList = []; //存放当前房间的用户列表
    var usersInRoom = io.sockets.adapter.rooms[socket.userInfo.roomId];//获取指定房间的信息
    for (var socketId in usersInRoom.sockets) { //获取指定房间内的在线所有用户对应的socketID
        if(userList[socketId]!=null) {  //将对应的连接用户的信息存到数组中,并返回。
            nameList.push({
                userId: userList[socketId].userId,
                nickName: userList[socketId].nickName,
                socketId: socketId
            }); //传递用户Id 昵称 sockedid
        }
    }
    return nameList;
}
//退出房间
function close(socket) {
    socket.on(‘close‘, function () {
        socket.leave(socket.id); //离开房间
        socket.broadcast.to(socket.userInfo.roomId).emit(‘userLeave‘, { //像这个房间内用户发送用户离开的通知,前台会在当前用户列表中删除这个用户
            userId: socket.userInfo.userId,
            nickName: socket.userInfo.nickName,
            socketId: socket.id
        });
        RemoveNickname(socket.id); //将这个人在用户列表集合中删除
    })
}

//关闭页面
function disconnect(socket) {
    socket.on(‘disconnect‘, function () { // 当用户之间关闭页面时,执行的逻辑和离开房间一样
        socket.leave(socket.id);
        if (socket.userInfo != null) {
            socket.broadcast.to(socket.userInfo.roomId).emit(‘userLeave‘, {
                userId: socket.userInfo.userId,
                nickName: socket.userInfo.nickName,
                socketId: socket.id
            });
            RemoveNickname(socket.id);
        }
    });
}
//发消息
function say(socket) {
    socket.on(‘say‘, function (message) { //广播消息,当前台发送过来一条消息时,会带着一个当前房间的id,然后直接向房间内的其他用户广播消息。
        content = message.content.trim();
        roomid = message.roomId;
        socket.broadcast.to(roomid).emit(‘userSay‘,{title:socket.userInfo.nickName, msg:xssEscape(content)}); //广播的消息需要xssEscape(content)一下,以防发生脚本攻击
    });
}

//删除房间内的用户
function RemoveNickname(socketId) {
    delete userList[socketId];
}

exports.listen = function (_server) {
    return io.listen(_server);
};
时间: 2024-10-12 22:53:52

socket服务端的实现的相关文章

socket服务端和客户端

#!/usr/bin/env python#encoding: utf-8import socketdef handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, World") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREA

C# Socket服务端和客户端互相send和receive

服务端 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Net.Sockets; 5 using System.Net; 6 using System.Threading; 7  8 namespace Controller 9 {10     public static class SocketServer11     {12         private stat

Java网络编程【Socket服务端和客户端】

Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一.Java 网络编程又包括 TCP.UDP,URL 等模块.TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块.URL 对应 URL 模块.其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议.两者之间的异同就不在这里说了,推荐一本入门书籍 <TCPIP入门经典>.我们开始 Socket 服务端和客户端编程吧. 一.Socket 服

socket服务端处理多个客户端的请求学习理解

socket服务端处理多个客户端的请求:while(true){Socket s=ss.accept();new WorkThread(s).start();}class WorkThread edtends Thread{private Socket s;public WorkThread(Socket s){this.s=s;}public void run(){s.getInput();s.getOutput();}}

C#下用select方法实现socket服务端

select是一种比较古老但一直被证明性能很好的socket模式,它可以让你以消息驱动的模式书写socket程序.网上C++的例子很多,但C#的例子极少. 上代码: namespace Server { class Program { // Thread signal. public static ManualResetEvent allDone = new ManualResetEvent(false); private static Socket handler = null; privat

Socket——服务端与客户端交互的简单实现

服务端: package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socke

C# Socket服务端与客户端通信(包含大文件的断点传输)

步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收信息   (3)发送数据(这里分发送字符串.文件(包含大文件).震动) 二.客户端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收信息   (3)发送数据(这里分发送

Socket服务端一直收空包的原因与解决方法

最近做socket服务端,大部分时候系统是正常的,但是运行个一段时间就会一直以超高的频率收到很多数据,一开始以为是下位机上报的,没怎么上心,后来下位机工程师说他们没上报,所以重新看了下代码,发现程序会一直调用 netStream.BeginRead,EndRead,一直收数据,而且受到的数据包都是0字节,百度了20分钟,大神们说socket客户端正常关闭的时候服务端会收到一个长度是0的数据包,如果一直循环调用会一直收到,原话如下 出现原因:一.用户正常退出,这时你还循环调用了Receive方法时

使用NewLife网络库构建可靠的自动售货机Socket服务端(一)

最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互. 第一,首先说一下我们需要实现的功能需求吧 1,首先客户有一堆自动售货机的设备,设备连接socket服务端后 定时发送设备实时状态作为心跳信息,并且服务端需要下发信息予以确认. 2,需要知道设备的实时在线状态 3,设备需要实现微信,支付宝扫码支付需求,当客户买东西的时候选择扫码支付时,设备上报产品价格信息,支付方式,服务器下发微信或者支付宝的当面付二维

最简单的一个socket服务端

描述:这是一个socket服务端,可以用串口调试工具连接和发送数据过来 package com.thinkgem.wlw.modules.lhjh.socket.tstandard; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import j