java h5_使用H5和java搭建聊天系统

本文介绍如何利用JavaScript的WebSocket与Java后端配合,搭建一个简单的聊天系统。前端通过WebSocket建立连接,发送和接收消息。后端使用Java的WebSocketServer处理连接,接收并广播消息。
摘要由CSDN通过智能技术生成

前台网页:

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 + '

');

}

}

后台:

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+"");

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+"");

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 userconnections = new HashMap();

/**

* 获取用户名

* @param session

*/

public static String getUserByKey(WebSocket conn){

return userconnections.get(conn);

}

/**

* 获取WebSocket

* @param user

*/

public static WebSocket getWebSocketByUser(String user){

Set 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 getOnlineUser(){

List setUsers = new ArrayList();

Collection setUser = userconnections.values();

for(String u:setUser){

setUsers.add(""+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 keySet = userconnections.keySet();

synchronized (keySet) {

for (WebSocket conn : keySet) {

String user = userconnections.get(conn);

if(user != null){

conn.send(message);

}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值