前台網頁:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="jquery.min_v1.0.js" type="text/javascript"></script>
<script>
var ws = '';//WebSocket對象
var userName = '測試同學' + parseInt(Math.random(1) * 888);//用戶名
//初始化連接
function openConnect() {
var address = "ws://"+ $("#ip").val() + ":" + $("#port").val();//服務端地址
if(ws==""){
ws = new WebSocket(address+"?login=123");
}else if(ws.readyState==3){
ws = new WebSocket(address);
}
if(ws.readyState!=1){
ws = new WebSocket(address);//實例化WebSocket對象
}
//開始連接時
// ws.onopen = function (e) {
// ws.send('[login]{"userid":"' + userName + '"}');
//};
//收到信息時
ws.onmessage = function (e) {
$('#msgBox').append('<p>' + e.data + '</p>');
};
//發生錯誤時
ws.onerror = function (e) {
try
{
switch (ws.readyState) {
case 0://CONNECTING
throw '<p>正在連接服務器。</p>';
break;
case 1://OPEN
throw '<p>已連接服務器。</p>';
break;
case 2://CLOSING
throw '<p>正在斷開服務器。</p>';
break;
case 3://CLOSED
throw '<p>已斷開服務器。</p>';
break;
default:
break;
}
} catch (errorMsg) {
$('#msgBox').append('<p>' + errorMsg + '</p>');
}
};
//連接關閉時
ws.onclose = function (e) {
$('#msgBox').append('<p>已斷開服務器。</p>');
};
}
//發送
function sendMsg() {
var SendText = $('#send').val();
try
{
if(ws.readyState==1){
ws.send('[send]{"msg":"' + SendText + '","user":"' + userName + '"}');
}
} catch (e) {
$('#msgBox').append('<p>' + e.name + ":" + e.message + '</p>');
}
}
//關閉連接
function closeConnect() {
try
{
ws.close();
} catch (e) {
$('#msgBox').append('<p>' + e.name + ":" + e.message + '</p>');
}
}
</script>
<title></title>
</head>
<body>
<input type="text" id="ip" value="127.0.0.1" placeholder="IP"/>
<input type="text" id="port" value="8887" placeholder="PORT"/>
<input type="button" onclick="openConnect();" value="連接" />
<input type="button" onclick="closeConnect();" value="斷開" />
<br><br>
<input type="text" id="send" placeholder="發送內容"/>
<input type="button" onclick="sendMsg();" value="發送"/>
<br><br>
<div id="msgBox"></div>
<br><br>
</body>
</html>
后台:
package com.fh.plugin.websocketInstantMsg;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Date;
import com.fh.util.PageData;
import com.fh.util.lx.LXUtil;
import net.sf.json.JSONObject;
import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketImpl;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
/**
* 即時通訊
* @author FH
* QQ 313596790
* 2015-5-16
*/
public class ChatServer extends WebSocketServer{
public ChatServer(int port) throws UnknownHostException {
super(new InetSocketAddress(port));
}
public ChatServer(InetSocketAddress address) {
super(address);
}
/**
* 觸發連接事件
*/
@Override
public void onOpen( WebSocket conn, ClientHandshake handshake ) {
//this.sendToAll( "new connection: " + handshake.getResourceDescriptor() );
//System.out.println("===" + conn.getRemoteSocketAddress().getAddress().getHostAddress());
String str = handshake.getResourceDescriptor().trim().substring(2);
PageData p = LXUtil.toPageData("{{0}}",str);
userjoin("",conn);
}
/**
* 觸發關閉事件
*/
@Override
public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
userLeave(conn);
}
/**
* 客戶端發送消息到服務器時觸發事件
*/
@Override
public void onMessage(WebSocket conn, String message){
message = message.toString();
if(null != message && message.startsWith("FHadminqq313596790")){
this.userjoin(message.replaceFirst("FHadminqq313596790", ""),conn);
}if(null != message && message.startsWith("LeaveFHadminqq313596790")){
this.userLeave(conn);
}if(null != message && message.contains("fhadmin886")){
String toUser = message.substring(message.indexOf("fhadmin886")+10, message.indexOf("fhfhadmin888"));
message = message.substring(0, message.indexOf("fhadmin886")) +"[私信] "+ message.substring(message.indexOf("fhfhadmin888")+12, message.length());
ChatServerPool.sendMessageToUser(ChatServerPool.getWebSocketByUser(toUser),message);//向所某用戶發送消息
ChatServerPool.sendMessageToUser(conn, message);//同時向本人發送消息
}else{
ChatServerPool.sendMessage(message.toString());//向所有在線用戶發送消息
}
}
public void onFragment( WebSocket conn, Framedata fragment ) {
}
/**
* 觸發異常事件
*/
@Override
public void onError( WebSocket conn, Exception ex ) {
ex.printStackTrace();
if( conn != null ) {
//some errors like port binding failed may not be assignable to a specific websocket
}
}
/**
* 用戶加入處理
* @param user
*/
public void userjoin(String user, WebSocket conn){
JSONObject result = new JSONObject();
result.element("type", "user_join");
result.element("user", "<a onclick=\"toUserMsg('"+user+"');\">"+user+"</a>");
ChatServerPool.sendMessage(result.toString()); //把當前用戶加入到所有在線用戶列表中
String joinMsg = "{\"from\":\"[系統]\",\"content\":\""+user+"上線了\",\"timestamp\":"+new Date().getTime()+",\"type\":\"message\"}";
ChatServerPool.sendMessage(joinMsg); //向所有在線用戶推送當前用戶上線的消息
result = new JSONObject();
result.element("type", "get_online_user");
ChatServerPool.addUser(user,conn); //向連接池添加當前的連接對象
result.element("list", ChatServerPool.getOnlineUser());
ChatServerPool.sendMessageToUser(conn, result.toString()); //向當前連接發送當前在線用戶的列表
}
/**
* 用戶下線處理
* @param user
*/
public void userLeave(WebSocket conn){
String user = ChatServerPool.getUserByKey(conn);
boolean b = ChatServerPool.removeUser(conn); //在連接池中移除連接
if(b){
JSONObject result = new JSONObject();
result.element("type", "user_leave");
result.element("user", "<a onclick=\"toUserMsg('"+user+"');\">"+user+"</a>");
ChatServerPool.sendMessage(result.toString()); //把當前用戶從所有在線用戶列表中刪除
String joinMsg = "{\"from\":\"[系統]\",\"content\":\""+user+"下線了\",\"timestamp\":"+new Date().getTime()+",\"type\":\"message\"}";
ChatServerPool.sendMessage(joinMsg); //向在線用戶發送當前用戶退出的消息
}
}
public static void main( String[] args ) throws InterruptedException , IOException {
WebSocketImpl.DEBUG = false;
int port = 8887; //端口
ChatServer s = new ChatServer(port);
s.start();
//System.out.println( "服務器的端口" + s.getPort() );
}
}
連接池:
package com.fh.plugin.websocketInstantMsg;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.java_websocket.WebSocket;
/**
* 即時通訊
* @author FH
* QQ 313596790
* 2015-5-16
*/
public class ChatServerPool {
private static final Map<WebSocket,String> userconnections = new HashMap<WebSocket,String>();
/**
* 獲取用戶名
* @param session
*/
public static String getUserByKey(WebSocket conn){
return userconnections.get(conn);
}
/**
* 獲取WebSocket
* @param user
*/
public static WebSocket getWebSocketByUser(String user){
Set<WebSocket> keySet = userconnections.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String cuser = userconnections.get(conn);
if(cuser.equals(user)){
return conn;
}
}
}
return null;
}
/**
* 向連接池中添加連接
* @param inbound
*/
public static void addUser(String user, WebSocket conn){
userconnections.put(conn,user); //添加連接
}
/**
* 獲取所有的在線用戶
* @return
*/
public static Collection<String> getOnlineUser(){
List<String> setUsers = new ArrayList<String>();
Collection<String> setUser = userconnections.values();
for(String u:setUser){
setUsers.add("<a onclick=\"toUserMsg('"+u+"');\">"+u+"</a>");
}
return setUsers;
}
/**
* 移除連接池中的連接
* @param inbound
*/
public static boolean removeUser(WebSocket conn){
if(userconnections.containsKey(conn)){
userconnections.remove(conn); //移除連接
return true;
}else{
return false;
}
}
/**
* 向特定的用戶發送數據
* @param user
* @param message
*/
public static void sendMessageToUser(WebSocket conn,String message){
if(null != conn && null != userconnections.get(conn)){
conn.send(message);
}
}
/**
* 向所有的用戶發送消息
* @param message
*/
public static void sendMessage(String message){
Set<WebSocket> keySet = userconnections.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String user = userconnections.get(conn);
if(user != null){
conn.send(message);
}
}
}
}
}