SocketConfig
package com.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;
}
}
ChatSocket
package com.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.google.gson.Gson;
import com.vo.ContentVo;
import com.vo.Message;
@ServerEndpoint("/chatSocket")
public class ChatSocket {
private static Set<ChatSocket> sockets=new HashSet<ChatSocket>();
private static Map<String, Session> sMap=new HashMap<String, Session>();
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);
this.sMap.put(username, session);
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 json ){
ContentVo vo = gson.fromJson(json, ContentVo.class);
if(vo.getType()==1){
Message message=new Message();
message.setSendMsg(vo.getMsg());
System.out.println(vo.getMsg());
message.setFrom(this.username);
message.setDate(new Date().toLocaleString());
broadcast(sockets, gson.toJson(message));
}else{
String to = vo.getTo();
Session to_session = this.sMap.get(to);
Message message=new Message();
message.setSendMsg(vo.getMsg());
message.setFrom(this.username);
message.setDate(new Date().toLocaleString());
try {
to_session.getBasicRemote().sendText(gson.toJson(message));
} catch (IOException e) {
e.printStackTrace();
}
}
}
@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();
}
}
}
}
LoginServlet
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
String username= request.getParameter("username");
request.getSession().setAttribute("username", username);
response.sendRedirect("chat.jsp");
}
}
ContentVo
private String to;
private String msg;
private Integer type;
Message
private String alert;
private List<String> names;
private String sendMsg;
private String from;
private String date;
login.jsp
<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>
chat.jsp
<script type="text/javascript" src="jquery-1.4.4.min.js"></script>
<script type="text/javascript">
var ws;
var url="ws://localhost:8080/chat-websocket/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("<input type=checkbox value='"+this+"'/>"+this+"<br/>");
});
}
if(result.from!=undefined){
$("#content").append(result.from+" "+result.date+
" 说:<br/>"+result.sendMsg+"<br/>");
}
};
}
function send(){
var ss = $("#userList :checked");
var value= $("#msg").val();
var obj = null;
if(ss.size()==0){
obj = {
msg:value,
type:1
}
}else{
var to = $("#userList:checked").val();
obj = {
to:to,
msg:value,
type:2
}
}
var str = JSON.stringify(obj);
ws.send(str);
$("#msg").val("");
}
</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>
测试,单聊选中即可