Achat ——— 基于多线程与网络通讯的聊天室
Achat - 基于多线程与网络通讯的聊天室
1.主要负责功能
1.用户私聊功能
使用了多线程以及网络通讯技术。服务端通过监听客户端,对客户端发来的信息进行转发等操作。
2.数据库读写编码部分
使用Mybatis框架技术实现了java与数据库之间的连接。与JDBC相比,减少了%50以上的代码量。同时更加灵活,直接编写动态SQL语句。
3.数据库设计
采用MySQL数据库。表设计符合第三范式。
2.负责功能详解
1.用户私聊功能
私聊功能需要实现客户端与服务端的连接,客户端需要发送说的话并由服务端进行转发。同时判断用户是否在线,在线即直接转发,然后存储到数据库中,不在线则直接保存数据库中,等待用户登录时加载。
点击查看代码
public void privateChat(ChatMsg cm) throws IOException { //客户端之间通过账号进行私聊
UserMsgToUser um = JSON.parseObject(cm.getPrivateMsg(), UserMsgToUser.class);
System.out.println(um.getDestUser().getAccount());
if (sockets.containsKey(um.getDestUser().getAccount())) {
Socket socket1 = sockets.get(um.getDestUser().getAccount());
DataOutputStream dou1;
try {
dou1 = new DataOutputStream(socket1.getOutputStream());
byte[] bytes = MsgTool.packMsg(cm);
dou1.write(bytes);
dou1.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = date.format(new Date());
MainFunction.saveMessage(um.getSrcUser().getAccount(), um.getDestUser().getAccount(), um.getMessage(), format);
}
2.数据库读写编码部分
通过Mybatis框架,编写对应的XML文件,通过接口编写方法。然后在MainFuction类中调用接口中的方法,进行数据库数据的读写。
点击查看代码
public static User saveInformation(User user) {
UserMapper userMapper = loadUserMapperXml();
userMapper.saveUser(user);
return user;
}
public static void updateUser() {
UserMapper userMapper = loadUserMapperXml();
}
//更新用户信息
public static void deleteUser() {
}
//踢出(删除)用户
public static void parseImage(Socket s, User user) {
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src\\photo\\" + user.getAccount() + ".jpg"));
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
byte[] b = new byte[2048];
int len = -1;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
bis.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static String returnImage(String account) throws IOException {
String str = ImgUtil.encodeImage("src\\photo\\" + account + ".jpg");
return str;
}
public static List newFriendsMessage(String account) {
NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
UserMapper userMapper = loadUserMapperXml();
List selectmessage = newFriendsMapper.selectmessage(account);
List users = new ArrayList<>();
for (String s : selectmessage) {
User user = userMapper.selevtUserbyAccount(s);
users.add(user);
}
return users;
}
public static void addNewFriend(String mAccount, String yAccount) {
NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
int i = newFriendsMapper.addFriend(mAccount, yAccount);
System.out.println(i);
}
public static void deleteMessage(String mAccount, String yAccount) {
NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
newFriendsMapper.delectAckMessage(mAccount, yAccount);
}
public static void addFriend(String mAccount, String yAccount) {
CompanionMapper companionMapper = loadCompanionMapperXml();
companionMapper.saveFrined(mAccount, yAccount);
}
public static void saveMessage(String aAccount, String bAccount, String message, String data) {
ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
chatMessageMapper.saveMessage(aAccount, bAccount, message, data);
}
public static ArrayList getMessage(String aAccount, String bAccount) {
ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
ArrayList messages = chatMessageMapper.getMessage(aAccount, bAccount);
return messages;
}
public static ArrayList getAllMessage(String account) {
ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
ArrayList accountMessages = chatMessageMapper.getAllMessage(account);
return accountMessages;
}
public static void deleteFriend(String account) {
CompanionMapper companionMapper = loadCompanionMapperXml();
ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
chatMessageMapper.deleteMessage(account);
companionMapper.deleteFriend(account);
}
public static ArrayList getMembers(String groupAccount) {
GroupMapper groupMapper = loadGroupMapper();
ArrayList members = groupMapper.getMembers(groupAccount);
return members;
}
public static ArrayList getGroups(String account) {
GroupMapper groupMapper = loadGroupMapper();
ArrayList gs = groupMapper.getGroups(account);
ArrayList groups = new ArrayList<>();
for (Integer i : gs) {
groups.add(i+"");
}
return groups;
}
public static String bulidGroup(String groupName ,String hostAccount){
GroupMapper groupMapper = loadGroupMapper();
Random random = new Random();
int number = random.nextInt(900000)+100000;
String groupAccount = groupNameBefore+number;
groupMapper.bulidGroup(groupAccount,groupName,hostAccount,hostAccount);
return groupAccount;
}
public static ArrayList writeGroups(User user){
GroupMapper groupMapper = loadGroupMapper();
UserMapper userMapper = loadUserMapperXml();
ArrayList groups = getGroups(user.getAccount());
ArrayList groups1 = new ArrayList<>();
for(String s :groups){
Group g = new Group();
g.setGroupAccount(s);
g.setGroupName(groupMapper.getGroupName(s).get(0));
ArrayList members = groupMapper.getMembers(s);
ArrayList users = new ArrayList<>();
for(String str : members){
User user2 = userMapper.selevtUserbyAccount(str);
users.add(user2);
}
g.setMembers(users);
g.setHostAccount(groupMapper.getHostAccount(s).get(0));
groups1.add(g);
}
return groups1;
}
public static void saveGroupMessage(String account,String groupAccount,String message,String date){
GroupMessageMapper groupMessageMapper = loadGroupMessageMapper();
groupMessageMapper.saveMessage(account,groupAccount,message,date);
}
public static ArrayList getGroupAccount(String account){
GroupMapper groupMapper = loadGroupMapper();
ArrayList groupAccounts = groupMapper.getGroupAccounts(account);
return groupAccounts;
}
public static ArrayList getGroupMessage(String account){
ArrayList groupAccount = getGroupAccount(account);
GroupMessageMapper groupMessageMapper = loadGroupMessageMapper();
ArrayList messages = new ArrayList<>();
for(String s : groupAccount){
messages.addAll(groupMessageMapper.getMessage(s));
}
return messages;
}
public static void saveGroup(String groupAccount,String memberaccount) {
GroupMapper groupMapper = loadGroupMapper();
ArrayList groupNames = groupMapper.getGroupName(groupAccount);
ArrayList hostAccount = groupMapper.getHostAccount(groupAccount);
if (groupNames == null || hostAccount == null) {
} else {
groupMapper.agreeAply(groupAccount, groupNames.get(0), hostAccount.get(0), memberaccount);
}
}
public static void hostExit(String hostAccount){
GroupMapper groupMapper = loadGroupMapper();
GroupMessageMapper groupMessageMapper = loadGroupMessageMapper();
groupMapper.hostExit(hostAccount);
groupMessageMapper.getMessage(hostAccount);
}
public static void memberExit(String memberAccount){
GroupMapper groupMapper = loadGroupMapper();
groupMapper.memeberExit(memberAccount);
}
public static boolean judgeExist(String senderAccount,String receiverAccount){
NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
String select = newFriendsMapper.select(senderAccount, receiverAccount);
if(select==null)
{
return false;
}
else {
return true;
}
}
3.数据库设计
数据库中一共有6个表,包括user(成员)、group(群)、companion(好友)、newfriends(新好友请求)、groupmessage(群聊天记录)、chatmessage(聊天).
点击查看代码
public static UserMapper loadUserMapperXml() {
String resource = "resources/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//设置事务自动提交
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
return usermapper;
}
public static CompanionMapper loadCompanionMapperXml() {
String resource = "resources/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//设置事务自动提交
CompanionMapper companionMapper = sqlSession.getMapper(CompanionMapper.class);
return companionMapper;
}
public static ChatMessageMapper loadChatMessageMapper() {
String resource = "resources/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//设置事务自动提交
ChatMessageMapper chatMessageMapper = sqlSession.getMapper(ChatMessageMapper.class);
return chatMessageMapper;
}
public static NewFriendsMapper loadNewFriendsMapper() {
String resource = "resources/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//设置事务自动提交
NewFriendsMapper newFriendsMapper = sqlSession.getMapper(NewFriendsMapper.class);
return newFriendsMapper;
}
public static GroupMessageMapper loadGroupMessageMapper() {
String resource = "resources/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//设置事务自动提交
GroupMessageMapper groupMessageMapper = sqlSession.getMapper(GroupMessageMapper.class);
return groupMessageMapper;
}
public static GroupMapper loadGroupMapper() {
String resource = "resources/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//设置事务自动提交
GroupMapper groupMapper = sqlSession.getMapper(GroupMapper.class);
return groupMapper;
}
3.课程设计感想
在建立Java与数据库的连接中,由于有些方法的参数是多个,在编写MySQL语句时的参数判断就十分重要,而Java提供注释@Pram修饰参数,这样就可以实现参数判断。
4.展望
数据库中一些动态SQL语句的实现,以及表的创建还应该进一步的细化。比如在创建user表和chatmessage表中,我在创建时是通过创建两个表来实现的,但是这两个表是毫无关联。而在创建表的时候是可以关联这两个表,通过内联表的方式进行连接。