WebSocket入门:实现简单聊天室

        WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

        本博客主要讲简单的实现,属于入门篇,直接上代码吧。

服务端 WebServer.java

@ServerEndpoint("/chat")
public class WebServer {
	
	private Session session = null;
	private static CopyOnWriteArraySet<WebServer> servers = new CopyOnWriteArraySet<WebServer>();
	
	@OnOpen
	public void onOpen(Session session) {
		this.session = session;
		servers.add(this);
		System.out.println("已连接" + session.getId());
	}
	
	@OnMessage
	public void onMessage(String msg) {
		System.out.println("客户端发送的消息" + msg);
		try {
			for (WebServer webServer : servers) {
				webServer.session.getBasicRemote().sendText(msg);				
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@OnClose
	public void onClose() {
		System.out.println(this.session.getId() + "退出了聊天室");
		servers.remove(this);
	}
}

登陆页面 login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登陆</title>
</head>
<body>
	<form action="webSocketServlet" method="post">
		<input type="text" name="logName"/>
		<input type="submit" value="进入聊天室">
	</form>
</body>
</html>

聊天室页面 chat.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>chatroom</title>
</head>
<body>
	<textarea rows="20" cols="20" id="content"></textarea>
	<form action="">
		<input type="text" id="message"/>
		<input type="submit" οnclick="toShow();return false;" value="发送">
	</form>
</body>
	<% String username = (String)request.getAttribute("username");%>
	<script type="text/javascript">
		function showMessage(msg){
			var value = document.getElementById("content").value;
			document.getElementById("content").value = value + "\n"+msg;
		}
		
		function toShow(){
			var val = document.getElementById("message").value;
			ws.send("[<%=username%>]说: " + val);	
			document.getElementById("message").value = "";
		}
		
		var ws = null;
		if (WebSocket) {
			ws = new WebSocket("ws://localhost:8082/websocket-demo/chat");
		}else{
			alert("不支持websocket!");
		}
		
		ws.onopen = function(){
			ws.send("<%=username%>进入聊天室");
			document.getElementById("message").focus();
		}
		
		ws.onmessage = function(event){
			showMessage(event.data);
		}
		
		window.onunload = function (){
			ws.send("<%=username%>退出聊天室");
			ws.close();
		}
	</script>
</html>

处理登陆的servlet WebSocketServlet.java

@WebServlet("/WebSocketServlet")
public class WebSocketServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String logName = request.getParameter("logName");
		request.setAttribute("username", logName);
		request.getRequestDispatcher("chat.jsp").forward(request, response);
	}
}

最后,web.xml配置上servlet

<servlet>
    <servlet-name>webSocketServlet</servlet-name>
    <servlet-class>com.learn.websocket.WebSocketServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>webSocketServlet</servlet-name>
    <url-pattern>/webSocketServlet</url-pattern>
</servlet-mapping>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值