กลับมาต่อกันในตอนที่สอง ในตอนนี้ผมจะสร้าง Servlet ที่รับ http request มาแล้วทำการส่งต่อ (broadcast) ให้ client ที่ต่อกับ websocket ของเรา

Node.js

ในคราวนี้ผมจะสร้าง function ที่ชื่อว่า broadCastMessage เพื่อทำการส่ง message ไปยัง client ทั้งหมด โดยมี argument เป็น wss กับ message นอกจากนั้นเราก็จะสร้าง http server ของเราขึ้นมาด้วย code ข้างล่าง บน port 8081 #http server เพื่อทำการรับ request แล้วส่งต่อไปยัง websocket client ของเรา โดย URL ที่ผมใช้คือ http://localhost:8081/?req=From%20HTTP%20Server โดย code จะอ่าน ค่าของ parameter req แล้วส่งต่อไปยัง function broadCastMessage อีกทีหนึ่งนั่นเอง

function broadCastMessage(wss,msg){
for (var i in wss.clients)
wss.clients[i].send(msg);
}

var WebSocketServer = require(‘ws’).Server;
var wss = new WebSocketServer({
port: 8080
});
wss.on(‘connection’, function (ws) {
ws.on(‘message’, function (message) {
console.log(‘received: %s’, message);
});
broadCastMessage(wss,’Websocket response from Node.js (ws module), total client:’ + wss.clients.length);

});
#http server
var url = require(‘url’);
var http = require(“http”);
var server = http.createServer(function (request, response) {
var url_parts = url.parse(request.url, true);
response.writeHead(200, {
“Content-Type”: “text/html”
});

response.write(“<html>”);
response.write(“<head>”);
response.write(“</head>”);
response.write(“<body>”);
response.write(“Node.js HTTP server<br/>”);
response.write(“sending <b>” + url_parts.query.req + “</b> to websocket clients”);
response.write(“</body>”);
response.write(“</html>”);
response.end();
console.log(url_parts.query.req);
broadCastMessage(wss,url_parts.query.req);
});

server.listen(8081);
console.log(“Server is listening”);

 

Java EE 7

สำหรับ java เราก็จะสร้าง servlet ขึ้นมาหนึ่งตัวชื่อว่า MyServlet ด้วย @WebServlet ทำงานเช่นเดียวกันคือรับ parameter req แล้วส่งต่อไปยัง ClientSessions ที่ถูก @Inject ให้โดยอัตโนมัติ แล้วเราก็เรียก method broadcastmessage ส่งข้อความออกไปยัง client

@WebServlet(name = “MyServlet”, urlPatterns = {“/MyServlet”})
public class MyServlet extends HttpServlet {

@Inject
ClientSessions cli;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html;charset=UTF-8”);
try (PrintWriter out = response.getWriter()) {
cli.broadcastMessage(request.getParameter(“req”));
out.println(“<!DOCTYPE html>”);
out.println(“<html>”);
out.println(“<head>”);
out.println(“<title>Servlet MyServlet</title>”);
out.println(“</head>”);
out.println(“<body>”);
out.println(“<h1>Servlet MyServlet at ” + request.getContextPath() + “</h1>”);
out.println(“</body>”);
out.println(“</html>”);
}
}

จบสำหรับ part 2 ส่วน part 3 นี่อาจจะเป็นมหากาพย์ Java EE7 + Node.js + Apache Camel + ActiveMQ เอามาเทียบกันจังๆ ว่าใครง่ายกว่าใคร