最近在openfire源码上做修改,以完成公司的聊天工具的服务器端的功能
今天实现了在服务器端增加聊天记录,这个记录不是所有的对话的记录,而只是简单的把聊过天的两个用户的id插入到一个数据库表中,这样如果用户换了设备登录仍可以看到和自己曾经聊过天的用户
首先建立一个chatHistory.java用来做数据库操作
package org.jivesoftware.openfire;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.openfire.user.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ChatHistory {
private static final Logger Log = LoggerFactory.getLogger(User.class);
private static final String INSERT_PROPERTY = "INSERT INTO chatHistory (user_id, target_id) VALUES (?, ?)";
private static final String LOAD_PROPERTY = "SELECT target_id FROM chatHistory WHERE user_id=?";
private static final String LOAD = "SELECT user_id FROM chatHistory"+ " WHERE target_id=?";
private String user_id;
private String target_id;
public List<String> getPropertyValue(String user, String domain) {
List<String> list = new ArrayList();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_PROPERTY);
pstmt.setString(1, user);
rs = pstmt.executeQuery();
while (rs.next()) {
list.add(rs.getString(1));
}
pstmt = con.prepareStatement(LOAD);
pstmt.setString(1, user + "@" + domain);
rs = pstmt.executeQuery();
while (rs.next()) {
list.add(rs.getString(1));
}
} catch (SQLException sqle) {
Log.error(sqle.getMessage(), sqle);
sqle.printStackTrace();
} finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return list;
}
public void createChatHistory(String user_id, String target_id) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DbConnectionManager.getConnection();
pstmt = conn.prepareStatement(INSERT_PROPERTY);
pstmt.setString(1, user_id);
pstmt.setString(2, target_id);
pstmt.executeUpdate();
} catch (SQLException sql) {
sql.printStackTrace();
Log.error(sql.getMessage(), sql);
System.out.println("error");
} finally {
DbConnectionManager.closeConnection(pstmt, conn);
}
}
public ChatHistory() {
}
public ChatHistory(String user_id, String target_id) {
if (user_id == null) {
throw new NullPointerException("user_id cannot be null");
}
this.user_id = user_id;
if (target_id == null) {
throw new NullPointerException("target_id cannot be null");
}
this.target_id = target_id;
}
}
注意,执行rs.getString();之前必须先执行rs.next();
List只有定义为ArrayList形式才可以用add方法来增加其内容而不必指出下标值
接下来只要在MessageRouter类中增加代码来判断数据库中是否有这两个用户会话的相应记录即可,有的话则不作操作,没有的话则在数据库中加入两个用户的id对即可
ClientSession session = sessionManager.getSession(packet.getFrom());
String messageFrom = packet.getFrom().getNode();
String domain = packet.getFrom().getDomain();
String messageTo = packet.getTo().toString();
String messageToNode = packet.getTo().getNode();
List<String> list = null;
chatHistory = new ChatHistory(messageFrom, messageTo);
list = chatHistory.getPropertyValue(messageFrom, domain);
if (list == null) {
chatHistory.createChatHistory(messageFrom, messageTo);
} else {
boolean i = list.contains(messageTo);
boolean k = list.contains(messageToNode);
if (!i && !k) {
chatHistory.createChatHistory(messageFrom, messageTo);
}
}
分享到:
相关推荐
jwchat汉化源码,基于openfire服务器端的,可以跑得通,直接将war格式文件导入到eclipse中即可。然后就可以应用了,注意jdk版本至少要1.5以上。
自己整合的里面有服务器端的搭建教程和开发文档,源码和SQL也有
扩展openfire的服务端代码。实现了图片,语音,视频发送,可创建群组。发表签名等功能。可作为android和ios聊天的服务端。
JWChat源码 1、首先配置jwchat要具备的环境(我开发的环境) tomcat7.0 jdk1.7 ...3. 在服务器端增加配置 xmpp.httpbind.client.requests.polling = 0 xmpp.httpbind.client.requests.wait = 10
java smack源码 Smack-Openfire im with Android, include heartbeat and auto reconnect ...Smack是一个开源,易于使用的XMPP(jabber)客户端类库。...配置连接OpenFire服务器,连接成功后设置响应Linstener和Receiv
androidpn基于Xmpp的消息推送源码包含了完整的客户端和服务器端。androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
服务器在web端开放了9090以供web后台使用 #接下来介绍整个app构架 我先排除掉不介绍的二次开发的ui xlistview: 里面有listhead和listfoot还有聊天窗口的listview和朋友圈的listview,主要用来下拉刷新下来加载更多 ...
商之翼采用OpenFire搭建高效率的即时通讯服务器,结合PHP与Javascri-pt的技术实现:桌面版客户端+Web版用户端,方便用户与商家即时沟通。因其强大的开源社区,便于二次开发,更可为用户和商家自定义开发桌面版客户端...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...
1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...