程序的流程图:

主要代码:

服务端 app.js

先加载所需要的通信模块:

var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io').listen(http);
var fs = require('fs');

创建用户列表和消息列表:

var person = [];
var history = [];

绑定并监听80端口:

app.get('/',function (req,res) {
res.sendFile(__dirname + '/login.html');
}); http.listen(80,function () {
console.log('listening on *:80');
});

客户端连接成功后,触发响应事件connection,完成要绑定的事件并实现客户端出发的事件:

io.sockets.on('connection',function (socket) {
var user = ''; socket.emit('history', history);
io.sockets.emit('updatePerson', person); socket.on('sendMsg', function (data) {
var obj = {};
obj.content = data;
obj.time = now();
obj.name = user;
if (history.length === history_num) {
history.shift();
}
history.push(obj);
io.sockets.emit('news', obj);
}); socket.on('setUserName', function (data) {
user = data;
person.push(user);
io.sockets.emit('loginsucess');
io.sockets.emit('updatePerson', person);
io.sockets.emit('news', {content: user + '进入房间', time: now(), name: '系统消息'});
}); socket.on('disconnect', function () {
if (user !== '') {
person.forEach(function (value, index) {
if (value === user) {
person.splice(index, 1);
}
});
io.sockets.emit('news', {content: user + '离开房间', time: now(), name: '系统消息'});
io.sockets.emit('updatePerson', person);
}
});
});

客户端 index.js:

先初始化用户信息:

 $scope.data = [];     //消息队列
$scope.name = ''; //用户名
$scope.content = ''; //用户输入的消息
$scope.personlist = []; //用户队列

然后连接服务器端:

const  socket_url = 'http://localhost';
var socket = io.connect(socket_url);

连接成功后,对用户昵称输入的验证:

$scope.checkName = function () {
if($scope.name!==''){
if($scope.personlist.length!==0){
if($scope.personlist.indexOf($scope.name)>-1) {
document.getElementById("info").textContent = "该昵称已被占用,请重新输入";
}
else{
socket.emit('setUserName', $scope.name);
}
}
else{
socket.emit('setUserName', $scope.name);
}
}
else{
document.getElementById('name').focus();
}
};

验证成功后,对用户输入消息要触发的事件:

$scope.sendMsg = function(data){
var date = new Date();
data = $scope.content;
if($scope.content !== ''){
socket.emit('sendMsg',data);
}
$scope.content = '';
};

程序的部分运行测试结果:

浏览器输入localhost后展示的用户登录界面:

昵称重复后的提示:

昵称输入成功后进入当前用户的聊天界面:

源码地址:github

参考学习:

Node.js + Web Socket 打造即时聊天程序嗨聊

基于websocket的一个简单的聊天室

websocket实现简单聊天程序的更多相关文章

  1. 基于html5 localStorage , web SQL, websocket的简单聊天程序

    new function() { var ws = null; var connected = false; var serverUrl; var connectionStatus; var send ...

  2. Android 网络编程基础之简单聊天程序

    前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...

  3. 用swoole和websocket开发简单聊天室

    首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中.第二,代码中一定要有日志记录和完善的报错并记录报错.言归正传,swoole应该是每个phper必须要了解的, ...

  4. Netty 系列八(基于 WebSocket 的简单聊天室).

    一.前言 之前写过一篇 Spring 集成 WebSocket 协议的文章 —— Spring消息之WebSocket ,所以对于 WebSocket 协议的介绍就不多说了,可以参考这篇文章.这里只做 ...

  5. Java网络编程--简单聊天程序

    背景 毕业设计前的练手,学校小比赛中的一个题目. 开发环境 Java(eclipse)+Mysql 简介 使用Java+Mysql开发以个简单的聊天工具,在本次项目中实现了: 1. 用户登录(客户端至 ...

  6. Flask基于websocket的简单聊天室

    1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.cha ...

  7. WebSocket 搭建简单聊天网站

    HTML5 WebSocket WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏 ...

  8. Python使用Socket写一个简单聊天程序

    b2b模式的聊天工具 服务端: # 链接 while True: print('等待连接...') sock,adr = server_socket.accept() while True: try: ...

  9. 基于websocket的页面聊天程序

    注:主要的问题是当浏览器窗口直接关闭时,后台会报异常,因为后台还在继续向浏览器端写数据,但是浏览器已经关闭了,会报java.net.SocketException:peer:Socket write ...

随机推荐

  1. Struts2总结优化登录与转发_02

    优化登录: 使用Struts2中的标签时,会生成大量的tr.td等,决定不使用Struts2中的标签,改用EL表达式,表单有大量数据时,不适合在控制层编写,所以用实体类封装URL中的参数. 控制层代码 ...

  2. PHP执行linux命令mkdir权限问题

    在linux系统中,root帐号执行php命令: mkdir('test', 0777); 结果文件的权限依然为: drwxr-xr-x 2 root root   Jul 27 19:30 test ...

  3. Jenkins发布MVC应用程序

    一个大的项目一般都会进行模块化.层次化分隔,每个模块.每个层次都可能是一个或多个工程文件组成,而且各个模块都有依赖关系,有先后顺序,先build哪个然后再build哪个都是有顺序的,如果想build一 ...

  4. 解决删除元素动画的bug

    效果说明 首先说明一下我需要做到的效果 其实很简单---点击删除按钮的时候,加入删除动画 删除动画是这样的,高度和宽度都会均匀的变小,内部的元素需要被隐藏(因为会有文字挤在一起):直到变为0结束,时长 ...

  5. 64位linux系统通过编译安装apache+…

    二.安装php 上传php压缩包 例如:php-5.2.3.tar.gz 移动 mv php-5.2.3.tar.gz /usr/local/src 进入 cd /usr/local/src 解压 t ...

  6. golang 之验证码api

    知识一:如何返回一个json数据? 先定义一个结构体ResponseData,2个参数,并返回的是json数据,key就是json后定义的名称 type ResponseData struct { S ...

  7. swift UILabel多行显示时 计算UILable的高度(可用于UILable高度自适应)

    代码如下 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = ...

  8. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  9. css的一些问题

    background-size ie8不支持怎么解决? background-size这个属性是css3,新增的属性,现在很多浏览器已经支持了,但是IE系列的浏览器却没有支持,比如IE8,下面介绍下如 ...

  10. HDU 6006 Engineer Assignment:状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0 ...