简单的聊天室

简介: 简单的聊天室

基于express+socket.io


express框架直接安装后得到模板

这是socket官网的例子: https://socket.io/get-started/chat

/**
 * Module dependencies.
 */
var app = require('../app');
var debug = require('debug')('server:server');
var http = require('http');
const { Server } = require("socket.io");
const users = {};
/**
 * Get port from environment and store in Express.
 */
var port = normalizePort(process.env.PORT || '8888');
app.set('port', port);
/**
 * Create HTTP server.
 */
var server = http.createServer(app);
// 解决跨域问题
const io = new Server(server, {
  allowEIO3: true,
  cors: {
    origin: "*", // from the screenshot you provided
    methods: ["GET", "POST"]
  }
});
io.on('connection', (socket) => {
  // 可以发送初始化消息 ---- 
  socket.on('username', (username) => {
    // 用对应的 socked.id 将用户姓名存入
    users[socket.id] = username
    // 广播给所有的用户
    socket.broadcast.emit('welcome', `欢迎<span>${username}</span>来到聊天室`);
    // 传送自己
    socket.emit('welcome', `欢迎<span>${username}</span>来到聊天室`);
  })
  socket.on('chat message', (msg) => {
    socket.broadcast.emit('message', `${users[socket.id]}:${msg}`);
    socket.emit('message', `${users[socket.id]}:${msg}`);
  });
});
/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
 * Normalize a port into a number, string, or false.
 */
function normalizePort(val) {
  var port = parseInt(val, 10);
  if (isNaN(port)) {
    // named pipe
    return val;
  }
  if (port >= 0) {
    // port number
    return port;
  }
  return false;
}
/**
 * Event listener for HTTP server "error" event.
 */
function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }
  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;
  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}
/**
 * Event listener for HTTP server "listening" event.
 */
function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
};
module.exports = io


html 文件

<!DOCTYPE html>
<html>
<head>
    <title>Socket.IO chat</title>
    <style>
        body {
            margin: 0;
            padding-bottom: 3rem;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
        }
        #form {
            background: rgba(0, 0, 0, 0.15);
            padding: 0.25rem;
            position: fixed;
            bottom: 0;
            left: 0;
            right: 0;
            display: flex;
            height: 3rem;
            box-sizing: border-box;
            backdrop-filter: blur(10px);
        }
        #input {
            border: none;
            padding: 0 1rem;
            flex-grow: 1;
            border-radius: 2rem;
            margin: 0.25rem;
        }
        #input:focus {
            outline: none;
        }
        #form>button {
            background: #333;
            border: none;
            padding: 0 1rem;
            margin: 0.25rem;
            border-radius: 3px;
            outline: none;
            color: #fff;
        }
        #messages {
            list-style-type: none;
            margin: 0;
            padding: 0;
        }
        #messages>li {
            padding: 0.5rem 1rem;
        }
        #messages>li:nth-child(odd) {
            background: #efefef;
        }
        .hint {
            height: 20px;
            line-height: 20px;
            font-size: 16px;
            color: #333;
        }
        .hint span {
            color: red;
        }
    </style>
</head>
<body>
    <ul id="messages"></ul>
    <form id="form">
        <input id="input" autocomplete="off" /><button>Send</button>
    </form>
    <!-- ./node_modules/socket.io/socket.io.js -->
    <script src="http://localhost:8888/socket.io/socket.io.js"></script>
    <script>
        var socket = io('http://localhost:8888');
        // 获取用户名称
        const username = prompt('请输入您的名称')
        var form = document.getElementById('form');
        var input = document.getElementById('input');
        const messages = document.getElementById('messages');
        class Message {
            add(msg, cls) {
                messages.innerHTML += `<li class=${cls}>${msg}</li>`
            }
        }
        const message = new Message()
        // 向服务器发送用户名称
        socket.emit('username', username);
        form.addEventListener('submit', function (e) {
            e.preventDefault();
            if (input.value) {
                socket.emit('chat message', input.value);
                input.value = '';
            }
        });
        socket.on('message', (msg) => {
            message.add(msg)
        })
        socket.on('welcome', (msg) => {
            console.log('触发自己')
            message.add(msg, 'hint')
        })
    </script>
</body>
</html>
相关文章
|
2月前
|
移动开发 安全 前端开发
技术心得记录:基于webSocket的聊天室
技术心得记录:基于webSocket的聊天室
|
3月前
|
存储 JavaScript Java
基于 WebSocket 打造聊天室
基于 WebSocket 打造聊天室
|
3月前
|
存储 前端开发 JavaScript
实现一个网页聊天室
实现一个网页聊天室
|
JSON 前端开发 JavaScript
|
11月前
|
移动开发 前端开发 网络协议
WebSocket网页聊天室
WebSocket网页聊天室
136 0
仿QQ聊天室【方案】
仿QQ聊天室【方案】
140 0
|
SQL 缓存 安全
一次群聊引发的血案
就在不久前,读者群因为一个提问引发了激烈的讨论!
一次群聊引发的血案
|
前端开发
Netty网络聊天(一) 聊天室实战
Netty网络聊天(一) 聊天室实战
200 0
Netty网络聊天(一) 聊天室实战
|
JSON 前端开发 小程序
Websocket直播间聊天室教程 - GoEasy快速实现聊天室
近期线上直播非常的火爆,很多朋友问如何用GoEasy实现直播间聊天室,然后我们就推出了这一篇直播间教程,希望能够为有直播间聊天室开发需求的开发者提供参考思路。
Websocket直播间聊天室教程 - GoEasy快速实现聊天室
|
存储 移动开发
【WebSocket No.2】WebSocket和Socket实现聊天群发
介绍: 前面写过一篇简单的websocke实现服务端。这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计。 直接不懂的可以看一下上一篇简单版本再来看也行:实现服务端WebSocket传送门 实现效果: 本示例主要实现了个什么东西哪,我们都使用qq或者其他的聊天工具,所有下面我说的大家也都懂。
1125 0