--- tags: Node.js --- # Node.js - Socket Server **Demo 專案連結** : [SocketServer](http://192.168.1.136/robin98727/Socket-Server_Node-js 為了熟悉WebSocket運作,利用Node.js做出一個簡易聊天室 ## 1. 目錄架構 ``` Socket Server |_____ index.html |_____ index.js |_____ package.json ``` ## 2. Flow chart圖解 ![Imgur](https://i.imgur.com/JqDMclf.png) ## 3. Start Write ### 環境設置 先設定package.json的資料 ```jsonld= { "name": "socket-chat-example", "version": "0.0.1", "description": "my first socket.io app", "dependencies": { "express": "^4.15.2", "socket.io": "^2.2.0" } } ``` 執行`npm install` ### 程式撰寫 #### server端(index.js) : ```javascript= //Express initializes app to be a function handler that you can supply to an HTTP server var app = require('express')(); var http = require('http').createServer(app); var io = require('socket.io')(http); app.get('/', function (req, res) { res.sendFile(__dirname + '/index.html'); }); //新使用者加進來 io.on('connection', function (socket) { socket.on('add user', function (msg) { socket.username = msg console.log("new user:"+msg+" logged.") io.emit('add user', { username: socket.username }) }) //監聽訊息是件 socket.on('chat message', function (msg) { console.log(socket.username+":"+msg); //發布新訊息 io.emit('chat message', { username:socket.username, msg:msg }) }); //使用者離開 socket.on('disconnect', function(){ console.log(socket.username+" left") io.emit('user left', { username:socket.username }) }) }); //建立 http server listen 在 port 3000 http.listen(3000, function () { console.log('listening on *:3000'); }); ``` client端(index.html): ```javascript= <!doctype html> <html> <head> <title>Socket.IO 聊天室</title> </head> <body> //使用者輸入後的對話列表 <div id="message_block"> <ul id="messages"></ul> </div> //輸入框 <input id="m" autocomplete="off" /><button id="send">Send</button> <script src="/socket.io/socket.io.js"></script> <script src="https://code.jquery.com/jquery-1.11.1.js"></script> <script> var socket = io(); $(document).ready(function(){ //彈跳出視窗,要使用者輸入名稱 var name = prompt("請輸入暱稱","guest") //如果沒有名稱,就變遊客ID if(name=="" || name == null){ name = "guest" } //tell server socket.emit("add user",name) //監聽訊息事件 socket.on('chat message', function(data){ appendMessage(data.username+":"+data.msg) }) socket.on('add user',function(data){ appendMessage(data.username+"已加入") }) socket.on('user left',function(data){ appendMessage(data.username+"已離開") }) //送出聊天內容到server $('#send').click(function(){ var text = $('#m').val() socket.emit('chat message', text) //清空剛輸入的 $('#m').val('') return false }) $("#m").keydown(function(event){ if(event.which == 13) { $('#send').click() } }) //將訊息,加入到對話列表 function appendMessage(msg) { $('#messages').append($('<li>').text(msg)) var message = document.getElementById("message_block") message.scrollTop = message.scrollHeight } }) </script> </body> </html> ``` ### 程式執行 1. 執行`node index.js` 2. 網址上輸入`http://localhost:3000/` ## 4. 成果展示 1. 執行`node index.js`後,終端機上會顯示 ![Imgur](https://i.imgur.com/PF308tQ.png) 2. 網址輸入`http://localhost:3000/`後會請使用者輸入暱稱(預設為guest) ![Imgur](https://i.imgur.com/ftHsaGL.png) 3. 輸入暱稱後會顯示該使用者已加入聊天室,並且在server端會顯示有新的user加入 ![Imgur](https://i.imgur.com/PFvAJEE.png) ![Imgur](https://i.imgur.com/1RNMhE7.png) 4. 使用者輸入文字後送出,會顯示在上方聊天室,並在server中顯示 ![Imgur](https://i.imgur.com/ISVfQwe.png) ![Imgur](https://i.imgur.com/TdfzrI3.png) 5. 當有新的使用者加入時,聊天室以及server會顯示 ![Imgur](https://i.imgur.com/agxLg7u.png) ![Imgur](https://i.imgur.com/AuZAX2N.png) 6. 當使用者離開的時候,聊天室以及server會顯示 ![Imgur](https://i.imgur.com/ZfD1nmK.png) ![Imgur](https://i.imgur.com/fdFZ6Dx.png)