使用H5和java搭建聊天系统

使用H5和java搭建聊天系统

前台网页:

<!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('

' + e.data + '

'
); }; //发生错误时 ws.onerror = function (e) { try { switch (ws.readyState) { case 0://CONNECTING throw '

正在连接服务器。

'
; break; case 1://OPEN throw '

已连接服务器。

'
; break; case 2://CLOSING throw '

正在断开服务器。

'
; break; case 3://CLOSED throw '

已断开服务器。

'
; break; default: break; } } catch (errorMsg) { $('#msgBox').append('

' + errorMsg + '

'
); } }; //连接关闭时 ws.onclose = function (e) { $('#msgBox').append('

已断开服务器。

'
); }; } //发送 function sendMsg() { var SendText = $('#send').val(); try { if(ws.readyState==1){ ws.send('[send]{"msg":"' + SendText + '","user":"' + userName + '"}'); } } catch (e) { $('#msgBox').append('

' + e.name + ":" + e.message + '

'
); } } //关闭连接 function closeConnect() { try { ws.close(); } catch (e) { $('#msgBox').append('

' + e.name + ":" + e.message + '

'
); } } </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", "+user+"');\">"+user+""); 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", "+user+"');\">"+user+""); 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("+u+"');\">"+u+""); } 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); } } } } }

资源:java_WebSocket 密码:kys8
使用H5和java搭建聊天系统_第1张图片

你可能感兴趣的:(java)