用JavaEE7、Websockets和GlassFish4打造聊天室(一)(1)(3)
分享于 点击 26437 次 点评:56
通过Bootstrap、Javacsript搭建简易客户端
最后,我们综合运用著名的Bootstrap、jQuery框架和Javascript设计一个简易的客户端。我们在src/main/weapp目录下新建立index.html文件,代码如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- [..]
- <script>
- var wsocket;
- var serviceLocation = "ws://0.0.0.0:8080/hascode/chat/";
- var $nickName;
- var $message;
- var $chatWindow;
- var room = '';
- function onMessageReceived(evt) {
- //var msg = eval('(' + evt.data + ')');
- var msg = JSON.parse(evt.data); // native API
- var $messageLine = $('<tr><td class="received">' + msg.received
- + '</td><td class="user label label-info">' + msg.sender
- + '</td><td class="message badge">' + msg.message
- + '</td></tr>');
- $chatWindow.append($messageLine);
- }
- function sendMessage() {
- var msg = '{"message":"' + $message.val() + '", "sender":"'
- + $nickName.val() + '", "received":""}';
- wsocket.send(msg);
- $message.val('').focus();
- }
- function connectToChatserver() {
- room = $('#chatroom option:selected').val();
- wsocket = new WebSocket(serviceLocation + room);
- wsocket.onmessage = onMessageReceived;
- }
- function leaveRoom() {
- wsocket.close();
- $chatWindow.empty();
- $('.chat-wrapper').hide();
- $('.chat-signin').show();
- $nickName.focus();
- }
- $(document).ready(function() {
- $nickName = $('#nickname');
- $message = $('#message');
- $chatWindow = $('#response');
- $('.chat-wrapper').hide();
- $nickName.focus();
- $('#enterRoom').click(function(evt) {
- evt.preventDefault();
- connectToChatserver();
- $('.chat-wrapper h2').text('Chat # '+$nickName.val() + "@" + room);
- $('.chat-signin').hide();
- $('.chat-wrapper').show();
- $message.focus();
- });
- $('#do-chat').submit(function(evt) {
- evt.preventDefault();
- sendMessage()
- });
- $('#leave-room').click(function(){
- leaveRoom();
- });
- });
- </script>
- </head>
- <body>
- <div class="container chat-signin">
- <form class="form-signin">
- <h2 class="form-signin-heading">Chat sign in</h2>
- <label for="nickname">Nickname</label> <input type="text"
- class="input-block-level" placeholder="Nickname" id="nickname">
- <div class="btn-group">
- <label for="chatroom">Chatroom</label> <select size="1"
- id="chatroom">
- <option>arduino</option>
- <option>java</option>
- <option>groovy</option>
- <option>scala</option>
- </select>
- </div>
- <button class="btn btn-large btn-primary" type="submit"
- id="enterRoom">Sign in</button>
- </form>
- </div>
- <!-- /container -->
- <div class="container chat-wrapper">
- <form id="do-chat">
- <h2 class="alert alert-success"></h2>
- <table id="response" class="table table-bordered"></table>
- <fieldset>
- <legend>Enter your message..</legend>
- <div class="controls">
- <input type="text" class="input-block-level" placeholder="Your message..." id="message" style="height:60px"/>
- <input type="submit" class="btn btn-large btn-block btn-primary"
- value="Send message" />
- <button class="btn btn-large btn-block" type="button" id="leave-room">Leave
- room</button>
- </div>
- </fieldset>
- </form>
- </div>
- </body>
- </html>
在上面的代码中,要注意如下几点:
在Javascript端要调用websocket的话,要用如下的方式发起连接即可:ws://IP:PORT/CONTEXT_PATH/ENDPOINT_URL e.g ws://0.0.0.0:8080/hascode/chat/java
创建一个Websocket连接的方法很简单,使用的是var wsocket = new WebSocket(‘ws://0.0.0.0:8080/hascode/chat/java’);
要获得来自服务端返回的信息,只需要在回调函数wsocket.onmessage中设置对应的获取返回信息的方法即可。
发送一个Websocket消息到服务端,使用的方法是wsocket.send(),其中可以发送的消息可以文本或者二进制数据。
关闭连接使用的是wsocket.close()。
Websocket中还有其他很多种用法,具体的可以参考其标准规范文档http://tools.ietf.org/html/rfc6455)
最后,我们通过
mvn package embedded-glassfish:run
进行代码的部署,然后就可以看到本文开始部分截图的效果。
本文的代码可以通过git获得:
git clone https://bitbucket.org/hascode/javaee7-websocket-chat.git
读者也可以通过这个地址下载可部署的war包:
用户点评