求一份基于java+websocket的网页在线聊天工程。。基础演示的就可以

fangzhixun111 2013-04-17 09:49:39
还有我想问下,为什么我的工程配置到tomcat7上面,连localhost都上不去了。
配置到tomcat6的话能运行程序,但是没法正常运作。。。

邮箱:fangzhixun@sina.com
跪谢!
...全文
698 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fang358229166 2014-08-07
  • 打赏
  • 举报
回复
请问楼主是如何解决的?
业余草 2014-06-21
  • 打赏
  • 举报
回复
另外需要注意的是tomcat必须是7.x以上的版本。tomcat7一下的版本,都不支持websocket的。另外还需要添加两个jar包。
业余草 2014-06-21
  • 打赏
  • 举报
回复
首先有一个普通的Servlet执行初始化,主要是定义一个List,用户存放WebSocket对象
public class InitServlet extends HttpServlet {

	private static final long serialVersionUID = -1936532122758235837L;
	
	private static List<MyWebSocket> socketList;
	
	public void init(ServletConfig config) throws ServletException {
		InitServlet.socketList = new ArrayList<MyWebSocket>();
		super.init(config);
		System.out.println("Server start============");
	}
	
	public static synchronized List<MyWebSocket> getSocketList() {
		return InitServlet.socketList;
	}

}
然后写一个Servlet处理请求,这个Servlet就返回一个WebSocket对象:
public class MyWebSocketServlet extends WebSocketServlet {

	private static final long serialVersionUID = -7302427588920888589L;

	@Override
	public WebSocket doWebSocketConnect(HttpServletRequest request, String arg1) {
		return new MyWebSocket();
	}

}
最后实现WebSocket,循环InitServlet中的List,给所有客户端发送消息:
public class MyWebSocket implements OnTextMessage {

	private Connection conn;

	/* (non-Javadoc)
	 * @see org.eclipse.jetty.websocket.WebSocket#onClose(int, java.lang.String)
	 * 一个客户端断开时,从List中移除
	 */
	@Override
	public void onClose(int arg0, String arg1) {
		InitServlet.getSocketList().remove(this);
		System.out.println("onClose==========================");
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jetty.websocket.WebSocket#onOpen(org.eclipse.jetty.websocket.WebSocket.Connection)
	 * 一个客户端连上来时,将它加入List
	 */
	@Override
	public void onOpen(Connection conn) {
		// 如果客户端在这个MaxIdleTime中都没有活动,则它会自动结束
		System.out.println("onOpen=========================="+conn.getMaxIdleTime());
		this.conn = conn;
		InitServlet.getSocketList().add(this);
	}
	
	
	/* (non-Javadoc)
	 * @see org.eclipse.jetty.websocket.WebSocket.OnTextMessage#onMessage(java.lang.String)
	 * 一个客户端发送数据后,触发它自己的onMessage方法,在这个方法里给所有在线的客户端发送这条消息
	 */
	@Override
	public void onMessage(String data) {
System.out.println("~~~~~~~~~~" + data);
		List<MyWebSocket> socketList = InitServlet.getSocketList();
		for (MyWebSocket socket : socketList) {
			try {
				socket.getConn().sendMessage(data);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	
	public Connection getConn() {
		return conn;
	}

	public void setConn(Connection conn) {
		this.conn = conn;
	}

}
好,服务器端代码展示完毕,接下来是前端HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Chart</title>
<script type="text/javascript" src="../../js/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
var ws = null;
function startWebSocket() {
	if (!window.WebSocket) alert("WebSocket not supported by this browser!");
	// 创建WebSocket
	ws = new WebSocket("ws://localhost:8080/html5chart/mywebsocket.do");
	// 收到消息时在消息框内显示
	ws.onmessage = function(evt) {   
		$('#msgBox').append(evt.data);
		$('#msgBox').append('</br>');
	};
	// 断开时会走这个方法
	ws.onclose = function() { 
		alert('close~~~~~~~');
	};
	// 连接上时走这个方法
	ws.onopen = function() {   
		alert('open~~~~~~~~'); 
	};
}
  
// 发送消息
function sendMsg() {
	var data = document.getElementById('msgSendBox').value;
	ws.send(data);
	document.getElementById('msgSendBox').value = '';
	
}
</script>
</head>
<body onload="startWebSocket();">
<div id="msgBox" style="width:400px;height:300px;border:1px solid #000000">
</div>
<textarea id="msgSendBox" rows="5" cols="32"></textarea>
<input type="button" value="send" onclick="sendMsg()"></input>
</body>
</html>
最后附上web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>html5test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
 
  <servlet>
    <servlet-name>initServlet</servlet-name>
    <servlet-class>lhc.init.InitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
  	<servlet-name>mywebsocket</servlet-name>
  	<servlet-class>lhc.websocket.MyWebSocketServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mywebsocket</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>
szandyye 2014-06-18
  • 打赏
  • 举报
回复
你tomcat服务开启了吗?需要开启服务。
孟子E章 2013-04-18
  • 打赏
  • 举报
回复
tomcat好像自带这样的example是好的。请更新到最新的Tomcat和浏览器
fangzhixun111 2013-04-17
  • 打赏
  • 举报
回复
引用 1 楼 net_lover 的回复:
你可以参照 http://redstarofsleep.iteye.com/blog/1488639
谢谢~但是给我报 严重: End event threw exception java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet 这个错误,网上好想说删了catalina.jar就好了,可是程序里要用到这个包吧。。。 还有tomcat好像自带这样的example,但是我运行起来都报websocket closed,是我tomcat有问题吗?
孟子E章 2013-04-17
  • 打赏
  • 举报
回复
你可以参照 http://redstarofsleep.iteye.com/blog/1488639

39,084

社区成员

发帖
与我相关
我的任务
社区描述
HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式.被认为是互联网的核心技术之一。
社区管理员
  • HTML5社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧