宝哥软件园

JavaEE7网络套接字玻璃鱼4打造聊天室

编辑:宝哥软件园 来源:互联网 时间:2021-10-03

在客户机和服务器之间建立单一的双向连接,这就意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端则可以在等待这个时间继续去做其他工作,整个过程是异步的。在本系列教程中,将指导用户如何在JAVA EE 7的容器玻璃鱼四中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及综合运用jQuery和自举。本文要求读者有一定的HTML 5网络套接字的基础原理知识。

效果图

我们先来看下在完成这个教程后的效果图,如下所示:

准备工作

我们使用的是JDK 7和MAVN 3进行库的构建工作,首先看pom.xml中关于Jave EE 7的部分:

已批准的属性。dir $ { project。建造。目录}/批准/认可。dir项目。建造。sourceencodingutf-8/项目。建造。source encoding/properties dependencies依赖项grouidjavax/Groupid artifactIdjavaee-API/artifactId 7.0版/提供的版本范围/范围/依赖项/依赖项构建插件groupIdorg.apache.maven.plugins/groupId artifactIdmaven-编译器-插件/artifact id 3.1版/版本配置source 1.7/source target compiler guments approvider $ { approved。目录}/属性.]/插件/插件/构建同时,为了能使用GlassFish 4,需要增加如下的插件:

插件groupIdorg.glassfish.embedded/groupId人工智能插件/人工智能4.0版/版本配置goa prefix-glass fish/goa prefix app $ { basedir }/target/$ { project。artifactId }-$ { project。版本} .war/app自动删除true/自动删除端口8080/端口名称$ { project。工件id }/名称contextrutascode/contextRoot/配置执行执行目标目标部署/目标/目标/执行/执行/插件设置Websocket的端点

我们先来看服务端Websocket的代码如下,然后再做进一步解析:

打包。有代码。教程;导入Java。io。ioexception导入Java。乌提尔。日志记录。水平;导入Java。乌提尔。日志记录。伐木工人;导入javax。web套接字。encodeexception导入javax。web套接字。onmessage导入javax。web套接字。onopen导入javax。web套接字。会议;导入javax。web套接字。服务器。路径参数;导入javax。web套接字。服务器。ServerEndPoint@ServerEndpoint(值='/聊天/{room} ',编码器=ChatMessageEncoder.class,解码器=ChatMessageDecoder.class)公共类ChatEndpoint {私有最终日志记录程序日志=Logger.getLogger(getClass().getName());@OnOpen公开作废开放(最终会议会话,@PathParam('room ')最终串房){原木。信息('会话开放结束并绑定到:房间);session.getUserProperties().放('房,房);} @OnMessage public void onMessage(最终会话会话,最终聊天消息聊天消息){字符串房间=(字符串)会话。getuser properties().get(' room ');请尝试{对于会话:会话。getopensessions()){ if(s . iso pen())room。等于(s . getuser properties().get(' room '){ s . getbasicremote().发送对象(聊天消息);} } } catch(IOexception | EncodeException e){ log。日志(级别1 .警告,onMessage失败,e);} } } 下面分析下上面的代码:

使用@服务器端点定义一个新的端点,其中的值指定了统一资源定位器并且可以使用路径参数参数,就象在JAX-RS中的用法一样。

所以值"/聊天/{room}”允许用户通过如下形式的统一资源定位器去连接某个聊天室:ws ://0。0 .0 .0:8080/有代码/聊天/Java

在大括号中的值(即房间),可以通过使用javax。web套接字。服务器。路径参数,在端点的生命周期回调方法中以参数的方式注入。

此外,我们要使用一个编码和解码的类,因为我们使用的是一个数据传输对象形式的类,用于在服务端和客户端传送数据。

当用户第一次连接到服务端,输入要进入聊天室的房号,则这个房号以参数的方式注入提交,并且使用session.getUserProperties将值保存在用户的属性地图中。

当一个聊天参与者通过传输控制协议连接发送信息到服务端,则循环遍历所有已打开的会话,每个会议被绑定到指定的聊天室中,并且接收编码和解码的信息。

如果我们想发送简单的文本信息或和二进制格式的信息,则可以使用session.getBasicRemote().sendBinary()或session.getBasicRemote().发送文本()

接下来我们看下用于代表信息传递实体(DTO:Data数据数据传输对象)的代码,如下:

打包。有代码。教程;导入Java。乌提尔。日期;公共类聊天消息{私有字符串消息;私有字符串发送者;收到私人日期;//其他吸气剂、设置剂方法} 聊天消息的转换

在这个应用中,将编写一个编码和解码类,用于在聊天信息和JSON格式间进行转换。

先来看下解码类的实现,这将会把传递到服务端的聊天信息转换为聊天消息实体类。在这里,使用的是JSON处理的爪哇应用编程接口(JSR353)规范去将JSON格式的信息转换为实体类,代码如下,其中重写的将解码方法,这里默认返回为真的。

打包。有代码。教程;导入Java。io。StringReader导入Java。乌提尔。日期;导入javax。JSON。Json导入javax。JSON。JSON对象;导入javax。web套接字。脱癸例外;导入javax。web套接字。解码器;导入javax。web套接字。endpointconfig公共类聊天消息解码器实现了解码器.textchatmessay { @覆盖公共void init(最终EndpointConfig配置){ } @覆盖公共void destroy(){ } @覆盖公共chatmessay decode(最终String textMessage)抛出decadeexception { chatmessay chatmessay=new chatmessay();JSON对象obj=Json。创建阅读器(新的字符串阅读器(文本消息)).readObject();聊天信息。setmessage(obj。getString(' message ');聊天信息。setsender(obj。getString(' sender ');chatMessage.setReceived(新日期());返回聊天消息} @覆盖公共布尔值将解码(最终字符串){返回真实} }同样再看下编码类的代码,这个类相反,是将聊天消息类转换为Json格式,代码如下:

打包。有代码。教程;导入javax。JSON。Json导入javax。web套接字。encodeexception导入javax。web套接字。编码器;导入javax。web套接字。endpointconfig公共类聊天消息编码器实现了编码器.textchatmessay { @ Override public void init(final EndpointConfig config){ } @ Override public void destroy(){ } @ Override public String encode(final chatmessay chatmessay)引发EncodeException { return Json。createobjectbuilder().添加(' message ',chatMessage.getMessage()).添加(“发件人”,chatMessage.getSender()).添加(“已收到”,chatMessage.getReceived().toString()).构建()。toString();} } 这里可以看到JSR-353的强大威力,只需要调用Json.createObjectBuilder就可以轻易把一个数据传输对象对象转化为JSON了。

通过Bootstrap、Javacsript搭建简易客户端

最后,我们综合运用著名的引导、jQuery框架和爪哇岛描述语言设计一个简易的客户端。我们在src/main/weap目录下新建立index.html文件,代码如下:

!DOCTYPE html html lang='en' head [.]脚本var wsocketvar服务位置=' ws ://0。0 .0 .0:8080/有代码/聊天/';var $ NIckvar $消息;var $ chatWindowvar room=函数onMessageReceived(evt){//var msg=eval('(' evt。数据')');var msg=JSON。解析(evt。数据);//原生API var $ messageLine=$(' trtd class='收到' '条消息。已接收'/tdtd class='用户标签标签-info'' msg.sender '/tdtd class='消息徽章' ' msg。消息'/TD/tr ');$ ChatWindow。追加($ messageLine);}函数send message(){ var msg=' { ' message ' : ' ' $ message。val()“”、“发件人”:“$ NiCKET . val()”、“收到”:“} wsocket。发送(消息);$message.val(" ")。焦点();}函数connectToChatserver(){ room=$(' #选择的聊天室选项: ').val();wsocket=new WebSocket(服务位置室);wsocket。on message=onMessageReceived}函数离开房间(){ wsocket。close();$ ChatWindow。empty();$('.聊天包装")。hide();$('.聊天-登录')。show();$ NIck。焦点();} $(文档)。ready(function(){ $ NIck=$(' # NIck '));$ message=$(' # message ');$ ChatWindow=$(' # response ');$('.聊天包装")。hide();$ NIck。焦点();$(' # Entroom ').点击(功能(evt){ evt。prevent default();connectToChatserver();$('.聊天包装H2 ' .文本(" # Chat # " $ NiCKET。val()“@”房间);$('.聊天-登录')。hide();$('.聊天包装")。show();$消息。焦点();});$(“# do-chat”).提交(函数(evt){ evt。prevent default();sendmail()});$(' #离开房间')。单击(function(){留有余地();});});/script/head body div class=' container chat-in ' form class=' form-in ' H2 class=' form-in-head ' chat sign/H2标签为='昵称'昵称/标签输入类型=' text ' class=' input-block-level '占位符='昵称' id='昵称' div class=' BTN-组'标签为='聊天室'聊天室/标签选择大小=' 1 ' id='聊天室' optionarduino/option Java/option groovy/option Scala/option-/container-div class=' container chat-wrapper ' form id=' do-chat ' H2 class=' alert alert-success '/H2表id=' response ' class=' table table-bordered '/表字段set legender您的消息./legend div class='controls '输入类型='text' class='输入块级'占位符='您的消息.'id=' message ' style=' height :60 px '/input type=' submit ' class=' BTN BTN-大号BTN-阻止BTN-主要'值='发送消息'/按钮=' BTN BTN-大号BTN-block ' type=' button ' id=' leave-room ' leave-room/button/div/field set/form/div/body/html在上面的代码中,要注意如下几点:

在爪哇岛描述语言端要调用websocket的话,要用如下的方式发起连接即可:ws ://ip:端口/CONTEXT _ PATH/ENDPOINT _ URL例如ws ://0。0 .0 .0:8080/有代码/聊天/Java

创建一个Websocket连接的方法很简单,使用的是var wsocket=new WebSocket(' ws ://0)。0 .0 .0:8080/has code/chat/Java’);

要获得来自服务端返回的信息,只需要在回调函数wsocket.onmessage中设置对应的获取返回信息的方法即可。

发送一个Websocket消息到服务端,使用的方法是wsocket.send(),其中可以发送的消息可以文本或者二进制数据。

关闭连接使用的是wsocket.close()。

最后,我们通过嵌入mvn包-玻璃鱼:run进行代码的部署,然后就可以看到本文开始部分截图的效果。

以上就是用JavaEE7 、网络套接字和玻璃鱼四实现的聊天室,希望对大家的学习有所帮助。

更多资讯
游戏推荐
更多+