java实现即时通讯_java实现WebSocket即时通信

本文介绍了如何使用Java API for WebSocket (JSR356) 在JavaEE7中创建一个WebSocket服务端,实现双向即时通信的简单聊天功能。通过Tomcat7和JDK7,创建了一个`@ServerEndpoint`注解的WebSocket类,用于处理连接打开、关闭、消息接收和错误处理。此外,还展示了如何在JSP页面中建立WebSocket连接,并处理接收到的消息。尽管WebSocket对低版本IE浏览器支持不佳,但这种技术能有效减少不必要的开销,适用于多人聊天或集体功能扩展。

序:JSR 356:Java API for WebSocket是javaee7新推出来的一个新的特性,他相对于其它容器实现,优点是他是一个标准.容器的更新都会遵守这个标准.不需要更改代码.减少后期的维护工作量.webscoket主要的作用是用来双向即时通信.对比传统的实现可以减少很多不必要的开销.但是对IE浏览器的支持就不太好了.所以如果客户群主要是IE而且是低版本的.使用该技术就要慎重了.

参考资料:

对浏览器的支持情况:

10

了解以上信息过后准备开始实现一个WEBSOCKET的DEMO.

准备工具:

tomcat7+

jdk7+ (webscoket是javaee7的新特性,所以必须版本是7及以上.)

创建工程:

创建一个名为webscoket的工程.

java文件如下:

01package org.temp;

02

03import java.io.IOException;

04import java.util.Hashtable;

05import java.util.Map;

06import java.util.Set;

07import java.util.logging.Logger;

08

09import javax.websocket.CloseReason;

10import javax.websocket.CloseReason.CloseCodes;

11import javax.websocket.OnClose;

12import javax.websocket.OnError;

13import javax.websocket.OnMessage;

14import javax.websocket.OnOpen;

15import javax.websocket.RemoteEndpoint;

16import javax.websocket.Session;

17import javax.websocket.server.PathParam;

18import javax.websocket.server.ServerEndpoint;

19//注意此访问地址格式如:"ws://"+ window.location.host+"/${pageContext.request.contextPath}/game"是ws开头的,而不是以http:开头的.

20@ServerEndpoint(value ="/game")

21public class Scoket {

22

23private Logger logger = Logger.getLogger(this.getClass().getName());

24

25static Map sessionMap =new Hashtable();

26

27@OnOpen

28public void onOpen(Session session) {

29sessionMap.put(session.getId(), session);

30}

31

32@OnMessage

33public void onMessage(String unscrambledWord, Session session) {

34broadcastAll("message",unscrambledWord);

35}

36/**

37* 广播给所有人

38* @param message

39*/

40public static void broadcastAll(String type,String message){

41Set> set = sessionMap.entrySet();

42for(Map.Entry i: set){

43try {

44i.getValue().getBasicRemote().sendText("{type:'"+type+"',text:'"+message+"'}");

45}catch (Exception e) {

46e.printStackTrace();

47}

48}

49}

50

51@OnClose

52public void onClose(Session session, CloseReason closeReason) {

53sessionMap.remove(session.getId());

54logger.info(String.format("Session %s closed because of %s", session.getId(), closeReason));

55}

56

57@OnError

58public void error(Session session, java.lang.Throwable throwable){

59sessionMap.remove(session.getId());

60System.err.println("session "+session.getId()+" error:"+throwable);

61}

62}

创建一个注解为:@ServerEndpoint的webscoket的服务端.供前台访问.因为想实现点其它功能.所以在广播给所有人这个方法里边加上了type以备区分

注解说明图:

10

接下来是jsp页面.直接上代码..

01

02pageEncoding="UTF-8"%>

03html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

04

05

06

07

Insert title here

09

10var socket =null;

11$(function(){

12function parseObj(strData){//转换对象

13return (new Function( "return " + strData ))();

14};

15//创建socket对象

16socket = new WebSocket("ws://"+ window.location.host+"/${pageContext.request.contextPath}/game");

17//连接创建后调用

18socket.onopen = function() {

19$("#showMsg").append("连接成功...
");

20};

21//接收到服务器消息后调用

22socket.onmessage = function(message) {

23var data=parseObj(message.data);

24if(data.type=="message"){

25$("#showMsg").append(""+data.text+"");

26}else if(data.type=="background"){

27$("#showMsg").append("系统改变背景地址,背景地址是:"+data.text+"");

28$("body").css("background","url("+data.text+")");

29}

30};

31//关闭连接的时候调用

32socket.onclose = function(){

33alert("close");

34};

35//出错时调用

36socket.onerror = function() {

37alert("error");

38};

39$("#sendButton").click(function() {

40socket.send($("#msg").val());

41});

42$("#abcde").click(function(){

43$.post("${pageContext.request.contextPath}/backgroundimg");

44});

45});

46

47

48

49

50

51

52

53

54

55

56

基本上就可以简单的实现了多人聊天功能了.或者集体换背景图片功能.

自己感兴趣的可以根据实际业务需求做一定的扩展.

等工作空下来会做进一步的进阶.再发文章出来.

本聊天系统采用客户机/服务器(C/S)地模式来设计,是一个3层地C/S结构:数据库服务器→应用程序服务器端→应用程序客户端,其分层结构如下图所示。系统采用C/S结构,可以将任务合理分配到客户机端和服务器端,从而降低了系统的通讯开销。 1. 客户层 客户层也叫应用表示层,是应用程序地客户接口部分。给聊天工具设计一个客户层具用很多优点,这是因为客户层担负着用户与应用间地对话功能。它用于检查用户的输入数据,显示应用的输出数据。为了使用户能直观的进行操作,客户层需要使用接口。若聊天用户变更,系统只需改写显示控制和数据检查程序即可,而不影响其他两层。数据检查的内容限于数据的形式和值得范围,不包括有关业务的处理逻辑。 2. 服务层 服务层又叫功能层,相当于应用的本体,他是讲具体的业务出路逻辑编入程序中。例如,用户需要检索数据,系统没法将有关检索要求的信息一次性的传送给功能层:而用户登陆后,聊天登录信息是由功能层处理过的检索结果数据,他也是一次性传送给表示层的。在应用设计中,不许避免在表示层和功能层之间进行多次的数据交换,这就需要尽可能进行一次性的业务处理,达到优化整体设计的目的。 3. 数据层 数据层就是DBMS,本聊天工具使用了Microsoft公司的SQL Server2000能迅速执行大量的更新和检索,因此,从功能层传送到数据层的“要求”一般都使用SQL语言。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值