大三在校学生,学了点websocket的内容,当作笔记;
实现了群发,单独通信也自然会了,就是session.getBasicRemote().sendText(msg);这个语句
群发:就是把当前连接的人的session for循环发送
单独:就是接受发送人的id,在map<String,session>中找到此人的session然后发送
代码亲测
目录:
config类 自动扫描
package com.bjsxt.init;
import java.util.Set;
import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
public class SocketConfig implements ServerApplicationConfig {
@Override
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> ss) {
// TODO Auto-generated method stub
System.out.println("endPoint扫描到的数量:"+ss.size());
return ss;
}
@Override
public Set<ServerEndpointConfig> getEndpointConfigs(
Set<Class<? extends Endpoint>> ss) {
// TODO Auto-generated method stub
System.out.println("实现EndPoint接口的类数量:"+ss.size());
return null;
}
}
实现接受信息,发送信息
package com.bjsxt.server;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import com.bjsxt.vo.Message;
import com.google.gson.Gson;
@ServerEndpoint("/chatSocket")
public class ChatSocket {
private static Set<ChatSocket> sockets=new HashSet<ChatSocket>();
// private static Map<String, ChatSocket> sMap=new HashMap<String, ChatSocket>();
private static List<String> names=new ArrayList<String>();
private Session session;
private String username;
private Gson gson=new Gson();
@OnOpen
public void open(Session session){
this.session=session;
sockets.add(this);
String queryString = session.getQueryString();
System.out.println(queryString);
this.username = queryString.substring(queryString.indexOf("=")+1);
names.add(this.username);
Message message=new Message();
message.setAlert(this.username+"进入聊天室!!");
message.setNames(names);
broadcast(sockets, gson.toJson(message) );
}
@OnMessage
public void receive(Session session,String msg ){
Message message=new Message();
message.setSendMsg(msg);
message.setFrom(this.username);
message.setDate(new Date().toLocaleString());
broadcast(sockets, gson.toJson(message));
}
@OnClose
public void close(Session session){
sockets.remove(this);
names.remove(this.username);
Message message=new Message();
message.setAlert(this.username+"退出聊天室!!");
message.setNames(names);
broadcast(sockets, gson.toJson(message));
}
public void broadcast(Set<ChatSocket> ss ,String msg ){
for (Iterator iterator = ss.iterator(); iterator.hasNext();) {
ChatSocket chatSocket = (ChatSocket) iterator.next();
try {
chatSocket.session.getBasicRemote().sendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
servlet 就是跳到chat.jsp页面
package com.bjsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username= request.getParameter("username");
request.getSession().setAttribute("username", username);
response.sendRedirect("chat.jsp");
}
}
接受发送消息的封装类
package com.bjsxt.vo;
import java.util.Date;
import java.util.List;
public class Message {
private String alert; //
private List<String> names;
private String sendMsg;
private String from;
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getSendMsg() {
return sendMsg;
}
public void setSendMsg(String sendMsg) {
this.sendMsg = sendMsg;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getAlert() {
return alert;
}
public void setAlert(String alert) {
this.alert = alert;
}
public List<String> getNames() {
return names;
}
public void setNames(List<String> names) {
this.names = names;
}
public Message() {
super();
// TODO Auto-generated constructor stub
}
}
聊天室主页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-1.4.4.min.js"></script>
<script type="text/javascript">
var ws;
var url="ws://localhost:9080/websocket_04/chatSocket?username=${sessionScope.username}";
window.onload=connect;
function connect(){
if ('WebSocket' in window) {
ws = new WebSocket(url);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(url);
} else {
alert('WebSocket is not supported by this browser.');
return;
}
ws.onmessage=function(event){
eval("var result="+event.data);
if(result.alert!=undefined){
$("#content").append(result.alert+"<br/>");
}
if(result.names!=undefined){
$("#userList").html("");
$(result.names).each(function(){
$("#userList").append(this+"<br/>");
});
}
if(result.from!=undefined){
$("#content").append(result.from+" "+result.date+
" 说:<br/>"+result.sendMsg+"<br/>");
}
};
}
function send(){
var value= $("#msg").val();
ws.send(value);
}
</script>
</head>
<body>
<h3>欢迎 ${sessionScope.username } 使用本系统!!</h3>
<div id="content" style="
border: 1px solid black; width: 400px; height: 300px;
float: left;
" ></div>
<div id="userList" style="
border: 1px solid black; width: 100px; height: 300px;
float:left;
" ></div>
<div style="clear: both;" >
<input id="msg" /><button onclick="send();" >send</button>
</div>
</body>
</html>
登录页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-1.4.4.min.js"></script>
</head>
<body>
<form name="ff" action="LoginServlet" method="post" >
用户名:<input name="username" /><br/>
<input type="submit" />
</form>
</body>
</html>
可能需要的jar包
完成后页面