久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

1024

 微他博 2022-10-16 發(fā)布于廣東

使用node.js和實(shí)現(xiàn)多人聊天室

2015年01月24日 03:24:54 遠(yuǎn)古大猛犸 閱讀數(shù):2775

轉(zhuǎn)自:

http://www.cnblogs.com/flyoung2008/archive/2012/07/19/2600132.html

http://blog./nodejs-socketio-chat/

 

一,、基本功能

1,、用戶隨意輸入一個(gè)昵稱即可登錄
2,、登錄成功后
1) 對(duì)正在登錄用戶來(lái)說(shuō),,羅列所有在線用戶列表,羅列最近的歷史聊天記錄
2) 對(duì)已登錄的用戶來(lái)說(shuō),,通知有新用戶進(jìn)入房間,,更新在線用戶列表
3、退出登錄
1)支持直接退出
2) 當(dāng)有用戶退出,,其他所有在線用戶會(huì)收到信息,,通知又用戶退出房間,,同時(shí)更新在線用戶列表
4、聊天
1) 聊天就是廣播,,把信息廣播給所有連接在線的用戶
5,、一些出錯(cuò)處理
1) 暫時(shí)簡(jiǎn)單處理了系統(tǒng)邏輯錯(cuò)誤、網(wǎng)絡(luò)出錯(cuò)等特殊情況的出錯(cuò)提示

問(wèn)題:功能不完善,,有bug(退出后,,新用戶重新登錄,還是原來(lái)的用戶) ,。抽空完善吧

二,、技術(shù)介紹

(官網(wǎng):http:///)是一個(gè)跨平臺(tái),多種連接方式自動(dòng)切換,,做即時(shí)通訊方面的開(kāi)發(fā)很方便,,而且能和expressjs提供的傳統(tǒng)請(qǐng)求方式很好的結(jié)合,即可以在同一個(gè)域名,,同一個(gè)端口提供兩種連接方式:request/response, websocket(flashsocket,ajax…),。

這篇文章對(duì)的使用做了詳細(xì)介紹:http://www.cnblogs.com/dxy1982/archive/2012/01/30/2328020.html

《用node.js和Websocket做個(gè)多人聊天室吧》http://www./HTML5features/WebSocket/20111206_3096.html

三、注意事項(xiàng)

(1)客戶端這樣引用.js:

<script src="http://.js"></script>

可能會(huì)加載失?。ㄎ以谶@里耗了不少時(shí)間)

可以改為:

<script src="http://ip:port//.js"></script>

(對(duì)應(yīng)服務(wù)器的ip地址和端口號(hào),,比如說(shuō)localhost和80端口)

(2)實(shí)現(xiàn)廣播的時(shí)候,參考官網(wǎng)的寫(xiě)法,,竟然不起作用,,如:

var io = require('').listen(80);

io.sockets.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
  socket.broadcast.json.send({ a: 'message' });
});

后來(lái)看了這個(gè):http:///questions/7352164/update-all-clients-using-socket-io

改為以下才起作用:

io.sockets.emit('users_count', clients);

四、效果圖

五,、源碼下載

  Nodejs多人聊天室

ps:

1,、在命令行運(yùn)行

node main.js

然后在瀏覽器中打開(kāi)index.html,如果瀏覽器(ff、Chrome)不支持,,請(qǐng)升級(jí)到支持WebSocket的版本.

2,、推薦node.js的IDE WebStorm

 

=============================================================================================================================

 

前言

網(wǎng)絡(luò)聊天室在web1.0的時(shí)代就出現(xiàn)了,但當(dāng)時(shí)技術(shù)支持比較有限,,大都是通過(guò)瀏覽器插件BHO,,JavaApplet,F(xiàn)lash實(shí)現(xiàn)的,。如今HTML5技術(shù)風(fēng)起云涌,,通過(guò)websocket實(shí)現(xiàn)的網(wǎng)絡(luò)聊天室,被定義為websocket的第一個(gè)實(shí)驗(yàn),,就像Hello World一樣的簡(jiǎn)單。

今天我也動(dòng)手完成了這個(gè)實(shí)驗(yàn),,感覺(jué)真的很爽,!

目錄

  1. 介紹
  2. 服務(wù)器端和客戶端通信設(shè)計(jì)
  3. 服務(wù)器端實(shí)現(xiàn)
  4. 客戶端實(shí)現(xiàn)
  5. 完整案例代碼

1. 介紹

一個(gè)是基于Nodejs架構(gòu)體系的,支持websocket的協(xié)議用于時(shí)時(shí)通信的一個(gè)軟件包。 給跨瀏覽器構(gòu)建實(shí)時(shí)應(yīng)用提供了完整的封裝,,完全由javascript實(shí)現(xiàn),。

基于Nodejs實(shí)現(xiàn)webscoket其他的框架,請(qǐng)參考文章:Nodejs實(shí)現(xiàn)websocket的4種方式

2. 服務(wù)器端和客戶端通信設(shè)計(jì)

chat

上圖中client1 和 server 描述通信過(guò)程,,client2描述對(duì)其他的客戶端,,通過(guò)廣播進(jìn)行消息通信。

  1. client1向server發(fā)起連接請(qǐng)求
  2. server接受client的連接
  3. client1輸入登陸用戶名
  4. server返回歡迎語(yǔ)
  5. server通過(guò)廣播告訴其他在線的用戶,,client1已登陸
  6. client1發(fā)送聊天信息
  7. server返回聊天信息(可省略)
  8. server通過(guò)廣播告訴其他在線的用戶,,client1的聊天消息
  9. client1關(guān)閉連接,退出登陸
  10. server通過(guò)廣播告訴其他在線的用戶,,client1已退出

我們看一下測(cè)試截圖:
chat2

  1. 左邊: aaa 登陸
  2. 右邊: bbb 登陸
  3. 左邊: aaa 收到 bbb登陸歡迎消息
  4. aaa 和 bbb 實(shí)現(xiàn)對(duì)話
  5. 右邊: bbb 刷新瀏覽自動(dòng)退出
  6. 左邊: aaa 收到 bbb的退出消息
  7. 右邊: CCC 登陸
  8. 左邊: aaa 收到 CCC 登陸歡迎消息
  9. aaa 和 CCC 實(shí)現(xiàn)對(duì)話

3. 服務(wù)器端實(shí)現(xiàn)

我們這里使用和express3的混合模式,,讓HTTP請(qǐng)求和WebSocket請(qǐng)求都使用3000端口。

服務(wù)器端實(shí)現(xiàn),,只有一個(gè)核心文件app.js,。

 
  1.  
  2. //引入程序包

  3. var express = require('express')

  4. , path = require('path')

  5. , app = express()

  6. , server = require('http').createServer(app)

  7. , io = require('').listen(server);

  8.  
  9. //設(shè)置日志級(jí)別

  10. io.set('log level', 1);

  11.  
  12. //WebSocket連接監(jiān)聽(tīng)

  13. io.on('connection', function (socket) {

  14. socket.emit('open');//通知客戶端已連接

  15.  
  16. // 打印握手信息

  17. // console.log(socket.handshake);

  18.  
  19. // 構(gòu)造客戶端對(duì)象

  20. var client = {

  21. socket:socket,

  22. name:false,

  23. color:getColor()

  24. }

  25.  
  26. // 對(duì)message事件的監(jiān)聽(tīng)

  27. socket.on('message', function(msg){

  28. var obj = {time:getTime(),color:client.color};

  29.  
  30. // 判斷是不是第一次連接,以第一條消息作為用戶名

  31. if(!client.name){

  32. client.name = msg;

  33. obj['text']=client.name;

  34. obj['author']='System';

  35. obj['type']='welcome';

  36. console.log(client.name + ' login');

  37.  
  38. //返回歡迎語(yǔ)

  39. socket.emit('system',obj);

  40. //廣播新用戶已登陸

  41. socket.broadcast.emit('system',obj);

  42. }else{

  43.  
  44. //如果不是第一次的連接,,正常的聊天消息

  45. obj['text']=msg;

  46. obj['author']=client.name;

  47. obj['type']='message';

  48. console.log(client.name + ' say: ' + msg);

  49.  
  50. // 返回消息(可以省略)

  51. socket.emit('message',obj);

  52. // 廣播向其他用戶發(fā)消息

  53. socket.broadcast.emit('message',obj);

  54. }

  55. });

  56.  
  57. //監(jiān)聽(tīng)出退事件

  58. socket.on('disconnect', function () {

  59. var obj = {

  60. time:getTime(),

  61. color:client.color,

  62. author:'System',

  63. text:client.name,

  64. type:'disconnect'

  65. };

  66.  
  67. // 廣播用戶已退出

  68. socket.broadcast.emit('system',obj);

  69. console.log(client.name + 'Disconnect');

  70. });

  71.  
  72. });

  73.  
  74. //express基本配置

  75. app.configure(function(){

  76. app.set('port', process.env.PORT || 3000);

  77. app.set('views', __dirname + '/views');

  78. app.use(express.favicon());

  79. app.use(express.logger('dev'));

  80. app.use(express.bodyParser());

  81. app.use(express.methodOverride());

  82. app.use(app.router);

  83. app.use(express.static(path.join(__dirname, 'public')));

  84. });

  85.  
  86. app.configure('development', function(){

  87. app.use(express.errorHandler());

  88. });

  89.  
  90. // 指定webscoket的客戶端的html文件

  91. app.get('/', function(req, res){

  92. res.sendfile('views/chat.html');

  93. });

  94.  
  95. server.listen(app.get('port'), function(){

  96. console.log("Express server listening on port " + app.get('port'));

  97. });

  98.  
  99. var getTime=function(){

  100. var date = new Date();

  101. return date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();

  102. }

  103.  
  104. var getColor=function(){

  105. var colors = ['aliceblue','antiquewhite','aqua','aquamarine','pink','red','green',

  106. 'orange','blue','blueviolet','brown','burlywood','cadetblue'];

  107. return colors[Math.round(Math.random() * 10000 % colors.length)];

  108. }

4. 客戶端實(shí)現(xiàn)

這里我們需要定義幾個(gè)文件:chat.html, chat.js, jquery.min.js, main.css

1). views/chat.html

 
  1.  
  2. <!DOCTYPE html>

  3. <html>

  4. <head>

  5. <meta charset="utf-8">

  6. <title>Socket.io - Simple chat</title>

  7. <link rel="stylesheet" type="text/css" href="css/main.css">

  8. <script src="javascripts/jquery.min.js"></script>

  9. <script src="http://.js"></script>

  10. <script src="javascripts/chat.js"></script>

  11. </head>

  12. <body>

  13. <h1>Socket.io - Simple chat room</h1>

  14. <div>

  15. <span id="status">Connecting...</span>

  16. <input type="text" id="input"/>

  17. </div>

  18. <div id="content"></div>

  19. </body>

  20. </html>

2). public/javascript/chat.js

 
  1.  
  2. $(function () {

  3. var content = $('#content');

  4. var status = $('#status');

  5. var input = $('#input');

  6. var myName = false;

  7.  
  8. //建立websocket連接

  9. socket = io.connect('http://localhost:3000');

  10. //收到server的連接確認(rèn)

  11. socket.on('open',function(){

  12. status.text('Choose a name:');

  13. });

  14.  
  15. //監(jiān)聽(tīng)system事件,,判斷welcome或者disconnect,打印系統(tǒng)消息信息

  16. socket.on('system',function(json){

  17. var p = '';

  18. if (json.type === 'welcome'){

  19. if(myName==json.text) status.text(myName + ': ').css('color', json.color);

  20. p = '<p style="background:'+json.color+'">system @ '+ json.time+ ' : Welcome ' + json.text +'</p>';

  21. }else if(json.type == 'disconnect'){

  22. p = '<p style="background:'+json.color+'">system @ '+ json.time+ ' : Bye ' + json.text +'</p>';

  23. }

  24. content.prepend(p);

  25. });

  26.  
  27. //監(jiān)聽(tīng)message事件,,打印消息信息

  28. socket.on('message',function(json){

  29. var p = '<p><span style="color:'+json.color+';">' + json.author+'</span> @ '+ json.time+ ' : '+json.text+'</p>';

  30. content.prepend(p);

  31. });

  32.  
  33. //通過(guò)“回車(chē)”提交聊天信息

  34. input.keydown(function(e) {

  35. if (e.keyCode === 13) {

  36. var msg = $(this).val();

  37. if (!msg) return;

  38. socket.send(msg);

  39. $(this).val('');

  40. if (myName === false) {

  41. myName = msg;

  42. }

  43. }

  44. });

  45. });

3). public/javascript/jquery.min.js
從jquery官方下載: http:///

4). public/css/main.css

 
  1.  
  2. * {padding:0px; margin:0px;}

  3. body{font-family:tahoma; font-size:12px;margin:10px;}

  4. p {line-height:18px;padding:2px;}

  5. div {width:500px;}

  6. #content {

  7. padding:5px;

  8. background:#ddd;

  9. border-radius:5px;

  10. border:1px solid #CCC;

  11. margin-top:10px;

  12. }

  13. #input {

  14. border-radius:2px;

  15. border:1px solid #ccc;

  16. margin-top:10px;

  17. padding:5px;

  18. width:380px;

  19. }

  20. #status {

  21. width:100px;

  22. display:block;

  23. float:left;

  24. margin-top:15px;

  25. }

5. 完整案例代碼

項(xiàng)目已經(jīng)上傳到github: https://github.com/bsspirit/chat-websocket

下載,,安裝,啟動(dòng)服務(wù)器

 
  1.  
  2. git clone https://github.com/bsspirit/chat-websocket.git

  3. npm install

  4. node app.js

打開(kāi)瀏覽器
可以多打開(kāi)幾個(gè)窗口,,模擬不同用戶有的對(duì)話,。

http://localhost:3000

做完實(shí)驗(yàn),感覺(jué)棒極了,。技術(shù)創(chuàng)新的革命?。?/p>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多