NodeJS实现简单聊天室

转载:https://cnodejs.org/topic/53787247cbcc396349fe3f5a

npm install express --save

npm install socket.io --save

chat.js

var express = require(‘express‘);
var io = require(‘socket.io‘);
var app = express();
app.use(express.static(__dirname));
var server = app.listen(8888);
var ws = io.listen(server);
ws.on(‘connection‘, function(client) {
    console.log(‘someone is connect.\n‘);
    client.on(‘join‘, function(msg) {
        if (checkNickname(msg)) {
            client.emit(‘nickname‘, ‘昵称重复‘);
        } else {
            client.nickname = msg;
            ws.sockets.emit(‘announcement‘, ‘系统‘, msg + ‘加入了聊天室‘, {type: ‘join‘, name: getAllNickname()});
        }
    });
    client.on(‘send.message‘, function(msg) {
        client.broadcast.emit(‘send.message‘, client.nickname, msg);
    });
    client.on(‘disconnect‘, function() {
        if (client.nickname) {
            client.broadcast.emit(‘send.message‘, ‘系统‘, client.nickname + ‘离开聊天室‘);
        }
    });
});
var checkNickname = function(name) {
    for (var k in ws.sockets.sockets) {
        if (ws.sockets.sockets.hasOwnProperty(k)) {
            if (ws.sockets.sockets[k] && ws.sockets.sockets[k].nickname == name) {
                return true;
            }
        }
    }
    return false;
}
var getAllNickname = function() {
    var result = [];
    for (var k in ws.sockets.sockets) {
        if (ws.sockets.sockets.hasOwnProperty(k)) {
            result.push({name: ws.sockets.sockets[k].nickname});
        }
    }
    return result;
}

chat.html

<!DOCTYPE html>
<html>
<head>
<title>socket.io聊天室例子</title>
<meta charset="utf-8">
<link rel="stylesheet" href="css/reset.css" />
<link rel="stylesheet" href="css/bootstrap.css" />
<link rel="stylesheet" href="css/app.css" />
</head>
<body>
<div class="wrapper">
    <div class="content" id="chat">
        <ul id="chat_container">
        </ul>
    </div>
    <div class="action">
        <textarea></textarea>
        <button class="btn btn-success" id="clear">清屏</button>
        <button class="btn btn-success" id="send">发送</button>
    </div>
</div>
<script type="text/javascript" src="socket.io.js"></script>
<script type="text/javascript">
var ws = io.connect(‘http://127.0.0.1:8888‘);
var sendMsg = function(msg) {
    ws.emit(‘send.message‘, msg);
}
var addMessage = function(from, msg) {
    var li = document.createElement(‘li‘);
    li.innerHTML = ‘<span>‘ + from + ‘</span>‘ + ‘ : ‘ + msg;
    document.querySelector(‘#chat_container‘).appendChild(li);
    document.querySelector(‘#chat‘).scrollTop = document.querySelector(‘#chat‘).scrollHeight;
    document.querySelector(‘textarea‘).focus();
}
var send = function() {
    var ele_msg = document.querySelector(‘textarea‘);
    var msg = ele_msg.value.replace(‘\r\n‘, ‘‘).trim();
    //console.log(msg);
    if (!msg) return;
    sendMsg(msg);
    addMessage(‘你‘, msg);
    ele_msg.value = ‘‘;
}
ws.on(‘connect‘, function() {
    var nickname = window.prompt(‘输入你的昵称‘);
    while (!nickname) {
        nickname = window.prompt(‘昵称不能为空‘);
    }
    ws.emit(‘join‘, nickname);
});
ws.on(‘nickname‘, function() {
    var nickname = window.prompt(‘昵称重复‘);
    while (!nickname) {
        nickname = window.prompt(‘昵称不能为空‘);
    }
    ws.emit(‘join‘, nickname);
});
ws.on(‘send.message‘, function(from, msg) {addMessage(from, msg);});
ws.on(‘announcement‘, function(from, msg) {addMessage(from, msg);});
document.querySelector(‘textarea‘).addEventListener(‘keypress‘, function(event) {
    if (event.which == 13) {
        send();
    }
});
document.querySelector(‘textarea‘).addEventListener(‘keydown‘, function(event) {
    if (event.which == 13) {
        send();
    }
});
document.querySelector(‘#send‘).addEventListener(‘click‘, function() {
    send();
});
document.querySelector(‘#clear‘).addEventListener(‘click‘, function() {
    document.querySelector(‘#chat_container‘).innerHTML = ‘‘;
});
</script>
</body>
</html>
时间: 2024-10-15 15:58:20

NodeJS实现简单聊天室的相关文章

nodejs实现简单聊天室2

server.js var http = require('http'); var express = require('express'); var sio = require('socket.io'); var app = express(); app.use(express.static(__dirname + '/')); var server = http.createServer(app); app.get('/', function(req, res) { res.sendFile

Python Socket 简单聊天室2

上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # -*- coding:utf-8 -*- import SocketServer class  mysocketclass(SocketServer.BaseRequestHandler):     def handle(self):         client_inform

ASP.NET 使用application和session对象写的简单聊天室程序

ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览器端的变量对象,用来存储跨网页程序程序的变量或者对象. 说实话,写了快一年的asp.net,application对象还真没怎么用过.看了看书,根据这两个对象的特性写了一个简单的聊天室程序.真的是非常的简陋. 我的思路是,有两个页面Default页和ChatRoom页,页面布局如图: Default

C#实例之简单聊天室(状态管理)

前言        状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生成一个网页实例.此时,旧网页的任务完成,旧网页的实例也随之消失.这种无状态,意味着客户端用户在浏览器中的一些状态或是对数据的一些修改都将丢失. 为了弥补这种基于web应用程序的固有限制,ASP.NET提供了多种用于管理状态的功能. 简单聊天室 这里运用System.Web命名空间的那些管理状态的类,

nodejs+socket.io聊天室

nodejs+socket.io 聊天室 Node.js v0.12.6 Socket.io v1.3.5 RequireJS v2.1.18 Materialize v0.97.0 聊天室演示地址 项目地址 版权声明:本文为博主原创文章,未经博主允许不得转载.

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

Asp.Net SignalR - 简单聊天室实现

原文:Asp.Net SignalR - 简单聊天室实现 简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 持久链接类有一个Groups的对象,通过这个对象,我们可以进行分组添加人员.发送消息.删除人员等操作 在连接事件中,给当前游客指定随机名称,并且返回当前已有的聊天室信息 protected override Task OnConnected

Java简单聊天室

实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发送消息,并且接收消息 * 1.1 消息发送至服务器:服务器每次都将客户发过来的信息发送到每个客户端 * 1.2 接收消息:发送的同时也要接收消息,所以必须有两个线程,一个发送消息,一个接收消息 * 1.3 关于这两个线程:如果没有线程,接收和发送就是按顺序执行的了,那么是发送后接收还是接收后发送?或

asp.net mvc signalr 简单聊天室

signalr的神奇.实用很早就知道,但一直都没有亲自去试用,仅停留在文章,看了几篇简单的介绍文字,感觉还是很简单易用的. 由于最后有个项目需要使用到它,所以就决定写个小程序测试一下,实践出真知:别人写的文章,由于环境(版本等)不同,还是或多或少存在一些出入的. 环境:vs2013 / asp.net mvc 5 / signalr 2.2.1 / jquery 1.10.2 先上两个效果图: 系统会自动给加入聊天室的人员分配一个ID,是该人员的唯一标识(绿色为当前用户说的话,橙色为当前用户之外