实现功能
1.历史消息存储
2.未读消息存储
题记
程序猿小白第一次写博客,有不足和改进的地方希望大家多多指教!
有关用socket实现即时聊天简易功能的文章上一抓一大把,博主最近在做的一款app中需要实现简单的即时聊天的功能,网上有极光的聊天服务可以接入,但博主作为一个萌新,一直没有搞明白接入逻辑,和自己app的适配也做得不好,一怒之下,博主就走上了写自己的即时聊天模块的道路。
博主并不清楚市面上常用的即时聊天软件的类似功能是如何实现的,博主自己摸索了一种存储方式,也很简单,IDE是eclipse,逻辑如下:发送消息的用户通过已经建立的socket传输消息到服务器,服务器接收消息后,返回确认码,通知客户端消息成功发送(博主用的确认码是getTimeInMillis()得出的long值),同时,服务器在用户的专用文件夹下搜索目标用户(私信发送给的用户)为名的txt文件,若没有,则创建,若有,则将发送信息的所有部分追加到txt文件中,同样,在目标用户的目录下也执行相应的逻辑,若目标用户不在线(没有和服务器建立socket联系),则将消息存入其目录下另一txt文件,如unread中,当目标用户登陆app时,发送post请求到服务器,服务器返回历史记录和unread记录,执行下一步逻辑,实现消息存储功能。
```java
// 发送私信的方法
@SuppressWarnings("resource")
private static void sendPersonalMessage(String message) {
String message_array[] = message.split("/");
System.out.print("发送私信");
String toUser = message_array[3];
String fromUser = message_array[4];
String time = message_array[1];
String message_id = message_array[2];
String message_type = message_array[5];
// 向客户端返回确认消息
sendBack(message);
if (socketGroup_main.containsKey(toUser)) {
// 目标用户在线上
CustomedSocket customedSocket = socketGroup_main.get(toUser);
try {
DataOutputStream dataOutputStream = customedSocket.dataOutputStream;
synchronized (dataOutputStream) {
dataOutputStream.writeUTF(message);
dataOutputStream.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 将信息存入两个user的信息交互txt文件中
// 第一步:存入发送者txt文件
FileWriter fWriter_fromUser = null;
try {
File file_fromUser = new File("C:/Maple/user/" + fromUser + "/message/history/" + toUser + ".txt");
if (!file_fromUser.exists()) {
file_fromUser.createNewFile();
}
fWriter_fromUser = new FileWriter(file_fromUser, true);
fWriter_fromUser.write(message + "\r\n");
fWriter_fromUser.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fWriter_fromUser.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 第二步,存入接收者的消息txt
FileWriter fWriter_toUser = null;
try {
File file_toUser = new File("C:/Maple/user/" + toUser + "/message/history/" + fromUser + ".txt");
if (!file_toUser.exists()) {
file_toUser.createNewFile();
}
fWriter_toUser = new FileWriter(file_toUser, true);
fWriter_toUser.write(message + "\r\n");
fWriter_toUser.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fWriter_toUser.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
// 目标用户不在线上
//第一步,存入发送者的txt消息历史记录中
// 第一步:存入发送者txt文件
FileWriter fWriter_fromUser = null;
try {
File file_fromUser = new File("C:/Maple/user/" + fromUser + "/message/history/" + toUser + ".txt");
if (!file_fromUser.exists()) {
file_fromUser.createNewFile();
}
fWriter_fromUser = new FileWriter(file_fromUser, true);
fWriter_fromUser.write(message + "\r\n");
fWriter_fromUser.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fWriter_fromUser.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//第二步
//将消息存入接收者的未读消息中
FileWriter fWriter_toUser = null;
try {
File file_toUser = new File("C:/Maple/user/" + toUser + "/message/unread/" + fromUser + ".txt");
if (!file_toUser.exists()) {
file_toUser.createNewFile();
}
fWriter_toUser = new FileWriter(file_toUser, true);
fWriter_toUser.write(message + "\r\n");
fWriter_toUser.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fWriter_toUser.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 返回确认信息
private static void sendBack(String message) {
String message_array[] = message.split("/");
System.out.println(message);
String message_id = message_array[2];
String toUser = message_array[3];
String fromUser = message_array[4];
String back_message = "1003" + "/" + fromUser + "/" + toUser + "/" + message_id;
if (socketGroup_main.containsKey(toUser)) {
CustomedSocket customedSocket = socketGroup_main.get(toUser);
try {
DataOutputStream dataOutputStream = customedSocket.dataOutputStream;
synchronized (dataOutputStream) {
dataOutputStream.writeUTF(back_message);
dataOutputStream.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}