实现功能
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();
			}
		}
	}