2016年8月21日笔记

tcp

  1. TCP/IP是不同的通信协议的大集合
  2. TCP -传输控制协议
    1. TCP用于从应用程序到网络的数据传输控制。
    2. 负责在数据传输之前将他们分割为IP包,然后在它们到达的时候将它们重组。
  3. IP-网络协议(Internet Protocol)
  4. IP负责计算机之间的通道
  5. IP负责在英特网上发送和接受数据包

长链接

socket实时聊天技术

  1. 用到的模块socket.io

server.js
var net = require('net');
var server = net.createServer((socket)=>{

var time = getTime();
//加入一个标签
//加入到客户列表中
var name = clients.add(socket);


//接收客户发过来的信息
socket.on('data',function(data){
//guangbo(data,socket),//接受来自客户端的信息
console.log('收到数据啦---');
console.log(data.toString());
//发送给所有人
clients.sendAll(socket,data);
});
//客户关闭了连接
socket.on('close',function(data){
console.log('客户走了~:'+socket.remoteAddress+' '+socket.remotePort);
//删除客户
clients.del(socket);
//发给所有人
clients.sendAll(socket,'有人走了!当前聊天人数:'+clients.length());
});
console.log('有人连接了,客服数量:'+clients.length());
console.log('有人连接了,客服数量:'+clients.length());

   socket.write(time +'欢迎进来聊天~'+ name + '!\n' +' 当前聊天人数:'+clients.length());
   clients.sendAll(socket,'有人进来了!当前聊天人数:'+clients.length());

}).on('error',(err)=>{
throw err;
});
Clients =new Object();
Clients.list=[];
//添加客服端到客户列表
//socket 当前的连接

 clients.add = function(socket){
    socket.name=socket.remoteAddress+remoteAddress+":"+socket.remotePort;
    this.list.push(socket);
    return socket.name;
 }

//从客户端列表删除
//socket 当前的socket

clients.del = function(socket){
console.log('用户要走了!删除他!!');
for(var i=0; i<this.list.length;i++){
if(socket == this.list[i]){
console.log('用户要走了!已经删除了~~~');
this.list.splice(i,1);
}
}
}


//把信息发给全部人

// socket 当前的连接
// data 要发送的数据

clients.sendAll = funciton(socket.data){
console.log('开始发送给全部人啦!!');
for(var i=1; i<this.list.length;i++){
if(socket !==this.list[i]){
var o = this.list[i];
//检测socket是否可以写
if(o.writable){
console.log('发送给:'+o.name);
o.write('-----\n'+getTime()+'\n'+socket.name+'说:\n');
o.write(data);
o.write('------');
}else{
console.log('socket 失效了:'+o.name);
//socket断开了什么的,就可以发送啦,需要删除这个连接
this.del(0);
}
}
}
}


// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { //author: meizz

var 0={
"M+":this.getMonth()+1,
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};

if(/(y+)/.test(fmt))fmt=fmt.reqlace(ReqExp.$1,(this.getFullYear()+"").4-RegExp.$1.length));
for(var k in o)
if(new RegExp("("+k+")").test(fmt)) fmt = fmt.replace(RegExp.$1(RegExp.$1.length==1)?(o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));

function getTime(){
return new Date().Format("yyyy-MM-dd hh:mm:ss");
}

//开启聊天服务器~~
server.listen({
host: 'localhost',
port: 8888,
exclusive: true
});
=====================
client.js
const net = require('net');
const client = net.connect({port:8080},()=>{
console.log('连上去了');
});
client.on('data',(data)=>{
console.log('收到数据');
console.log(data.toString());
});
client.on('end',()=>{
console.log('断开了');
rl.close();
});

const readline = require('readline');
const rl = readline.createInterface(process.stdin,process.stdout);
console.log('多人聊天室');
console.log('88.不聊了');
rl.setPrompt('随便说点什么吧~> ');
rl.prompt();

rl.on('line',(line)=>{
switch(line.trim()){
switch(line.trim()){
case'88':
console.log('欢迎下次再来~玩耍哦~~!');
rl.close();
break;
default:
s=line.trim();
client.write(s+'\r\n');

   rl.setPrompt('随便说点什么吧~> ');
   rl.prompt();
 break;

}
}).on('close', () => {
console.log('记得回来继续聊.');
process.exit(0);
});
===========
chat.js

var express = require('express');
var router = express.Router();
var socket_io = require('socket.io');
var db = require('../model/mongoose');
// GET users listing.
router.get('/', function (req, res, next) {
res.send('respond with a resource');
});

router.prepareSocketIO = function (server) {
var io = socket_io.listen(server);
var clientList = [];
var interlocutors = [];
io.sockets.on('connection', function (socket) {//连接

    clientList.push(socket);
    console.log("连接人数:" + clientList.length);
    console.log("连接数据" + socket);
    socket.on('join', function (user) {//获取名称

        socket.user = user;

        var socketusers ={ user_name:user}
        db.socketuserModel.findOne(socketusers,function(error, result){
            console.log('he'+result+error);
            if(result ==null ){

                db.socketuserModel.create(socketusers, function(error){});

            }
        });

        //socket.emit('state', 'SERVER', true);
        //socket.broadcast.emit('state', 'SERVER', user + '上线了');//广播名字
    });
    socket.on('sendMSG', function (msg) {//发送内容存入数据库
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth()+1;
        var day = date.getDate();
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        var times = year+'年'+month+'月'+day+'日 '+hour+':'+minute+':'+second;
        var socketusersmsg ={ user_name:socket.user,send_msg:msg,send_time:times}
        db.socketusermsgModel.create(socketusersmsg, function(error){});
        socket.emit('chat', socket.user, msg);
        socket.broadcast.emit('chat', socket.user, msg);//广播内容
    });

     socket.on('getMSG', function (msg) {//获取聊天记录

        var usersmsg ={ user_name:socket.user}
        db.socketusermsgModel.find(usersmsg,function(error, result){
            console.log('he'+result+error);
            for(var i=0;i<result.length;i++){
                console.log(result[i].send_msg);
            }
        })//.sort({send_time:-1}).limit(1);
        //socket.emit('chat', socket.user, msg);
        //socket.broadcast.emit('chat', socket.user, msg);
    });
});

};

module.exports = router;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,419评论 1 37
  • 01.{ 换行: Opening Brace Can't Be Placed on a Separate Lin...
    码农不器阅读 2,371评论 0 14
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,017评论 1 10
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,621评论 2 17
  • 先说说自身的情况:写作零基础,是新生大学学员,之前一直想像笑来老师那样,每天写2000字,可自己就一直迟迟未动手。...
    陈伟业阅读 285评论 0 0