使用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('<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);
}
}
}
}
}


猜你喜欢

转载自www.cnblogs.com/ylx520/p/10141139.html