2016年8月21日笔记

2016-08-22  本文已影响0人  zy01

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;

上一篇 下一篇

猜你喜欢

热点阅读