uswebsocket.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //引用http和socket.io模块
  2. var us = {}
  3. //包含http模块
  4. us.http = require('http');
  5. //包含文件模块,以实现能够读取本目录下面任意文件的功能
  6. var fs = require('fs');
  7. //支持目录文件模块
  8. var path = require('path');
  9. //包含socket.io模块
  10. var socketio = require('socket.io');
  11. //nodejs的underscore扩展中的findWhere方法,可以是我们很容易在对象集合中,通过对象的属性值找到该对象并返回。
  12. var _ = require('underscore');
  13. //构建文件读取路径。自己实现web服务器功能
  14. us.handler=function(request, response) {
  15. //console.log('request starting...');
  16. var filePath = '.' + request.url;
  17. if (filePath == './')
  18. filePath = './index.html';
  19. var extname = path.extname(filePath);
  20. var contentType = 'text/html';
  21. switch (extname) {
  22. case '.js':
  23. contentType = 'text/javascript';
  24. break;
  25. case '.css':
  26. contentType = 'text/css';
  27. break;
  28. case '.json':
  29. contentType = 'application/json';
  30. break;
  31. case '.png':
  32. contentType = 'image/png';
  33. break;
  34. case '.jpg':
  35. contentType = 'image/jpg';
  36. break;
  37. case '.wav':
  38. contentType = 'audio/wav';
  39. break;
  40. }
  41. fs.readFile(filePath, function(error, content) {
  42. if (error) {
  43. if(error.code == 'ENOENT'){
  44. fs.readFile('./404.html', function(error, content) {
  45. response.writeHead(200, { 'Content-Type': contentType });
  46. response.end(content, 'utf-8');
  47. });
  48. }
  49. else {
  50. response.writeHead(500);
  51. response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
  52. response.end();
  53. }
  54. }
  55. else {
  56. response.writeHead(200, { 'Content-Type': contentType });
  57. response.end(content, 'utf-8');
  58. }
  59. });
  60. }
  61. //创建httpserver,管理文件路径
  62. us.app = us.http.createServer(us.handler);
  63. //开启888端口,服务开始监听
  64. //us.app.listen(888);
  65. const hostname="127.0.0.1";
  66. const port=888;
  67. us.app.listen(port, hostname);
  68. console.log(`Server running at http://${hostname}:${port}/`);
  69. //也可以采用下面的写法,但代码更多
  70. /*us.app.listen(port, hostname, function() {
  71. console.log(`Server running at http://${hostname}:${port}/`);
  72. });*/
  73. //输出调试信息
  74. //console.log("Http Server start at 888");
  75. //socketio开始监听http请求
  76. us.socketio = socketio.listen(us.app);
  77. //webSocket协议握手成功
  78. ////'connection' 是socket.io 保留的.不能错,结果在变量socket中
  79. us.socketio.sockets.on('connection', function (socket) {
  80. //用户登录后端,以实现私聊,此处的登录只是把唯一的用户名放入内存。还未未实现cookie认证功能。
  81. socket.on('socketLogin',function (data) {
  82. //如果存在相同名称用户,弹出提示
  83. var toSocket= _.findWhere(us.socketio.sockets.sockets,{name:data.msg});
  84. if(toSocket){
  85. //如果用户名重复,自己给自己发送消息,现在的socket是自己的socket。
  86. socket.emit("UserNameRepeat",data.msg);
  87. return;
  88. }
  89. //以唯一的用户名给该用户设置socket。
  90. socket.name = data.msg;
  91. //把该用户名广播给其他用户,让其他用户好友列表中出现该用户
  92. socket.broadcast.emit('addFriend', data);
  93. });
  94. //向其他人发送信息
  95. socket.on('sayTo',function (data) {
  96. var toName = data.to;
  97. //查找是否存在该用户的socket。
  98. var toSocket= _.findWhere(us.socketio.sockets.sockets,{name:toName});
  99. //如果存在,则发送消息
  100. if(toSocket){
  101. //私聊
  102. toSocket.emit('sayTo',data.msg);
  103. }
  104. })
  105. //前端javascript使用socket.emit('msg', { msg: str }); //字符串msg是自己定义的,
  106. //socket.on('msg',function (data) {}); 后端需要用msg接收前端发送来的消息。'msg'需要和客户端发送时定义的事件名相同。
  107. socket.on('broadCast', function (data) {
  108. console.log('Get a msg from client ...');
  109. //console.log(data);
  110. //向客户端javascript发送广播,注意:这里广播消息为bcast,
  111. //则前端javascript用socket.on('bcast', function (r) {alert(r); });接收消息
  112. socket.broadcast.emit('broadCast', data);
  113. });
  114. //console.log("WebSocket connect ok....");
  115. //断开链接
  116. socket.on('disconnect', function(){
  117. console.log(socket.name+' connection is disconnect!');
  118. });
  119. })