实现功能
1.历史消息存储
2.未读消息存储

题记

程序猿小白第一次写博客,有不足和改进的地方希望大家多多指教!有关用socket实现即时聊天简易功能的文章csdn上一抓一大把,博主最近在做的一款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 blocke.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 blocke.printStackTrace();} finally {try {fWriter_fromUser.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 第二步,存入接收者的消息txtFileWriter 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 blocke.printStackTrace();} finally {try {fWriter_toUser.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} finally {try {fWriter_fromUser.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} finally {try {fWriter_toUser.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();}}}
 博主第一次写博客,请多多支持哦!

Android 深入实现基于socket套接字的即时聊天相关推荐

  1. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  2. 计算机网络(二) | 网络编程基础、Socket套接字、UDP和TCP套接字编程

    目录 一.网络编程基础 1.1 为什么需要网络编程 1.2 什么是网络编程 1.3 网络编程中的基本概念 二.Socket套接字 2.1 概念 2.2 分类 2.3 Java数据报套接字通信模型 2. ...

  3. 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

    基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socketserver = socket.socket(socket.AF_INET,socket.S ...

  4. day7 面向对象进阶、socket套接字

    文章目录 1. 静态方法.类方法 1.1 静态方法 1.2 类方法 2. 属性方法 3. 类的一些成员方法 4. 反射 5. 异常处理 6. socket 套接字 1. 静态方法.类方法 1.1 静态 ...

  5. Python开发基础----异常处理、socket套接字基础1

    异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...

  6. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  7. Python网络编程——socket套接字实现UDP/TCP信息传输

    socket套接字 socket(简称 套接字) ,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来 ...

  8. Socket 套接字和解决粘包问题

    ---恢复内容开始--- Socket 套接字: 什么是socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实 就是一个门面模式,它 ...

  9. 并发编程知识总结,软件开发架构,socket套接字模板,粘包问题,struct解决粘包问题,上传大文件数据,socketserver,关于操作系统的发展史,进程,线程。...

    并发编程知识总结 软件开发架构 C/S: client:客户端 server:服务端 优点:占用网络资源少,软件的使用稳定 缺点:服务端更新后,客户端也要更新,需要使用多个软件,需要下载多个客户端 B ...

最新文章

  1. Meta AI 新研究,统一模态的自监督新里程碑
  2. C语言-二维数组做函数的参数
  3. 第十一周项目实践4 BFS(广度优先搜索)基本模板
  4. Windows系统中安装Python模块pip numpy matplotlib
  5. 一线大厂为什么对免费的开源项目这么热衷?
  6. hive mysql远程模式_Hive远程模式启动
  7. php需要什么技能,PHP初学者必备的技能
  8. [thinkphp 5.0源码阅读] 缓存(一)
  9. Android 8.0 Settings新添加的重写getMetricsCategory
  10. Java 1.1字符串
  11. 利用github for windows 工具将本地的内容同步到github上
  12. PIX4D工作手册分享
  13. SVN提示: File or directory '*' is out of date; try updating 解决方案 .
  14. 【Tools】ZoomIt使用方法
  15. MATLAB 图像处理工具箱 一种简单的基于图像处理交通信号灯识别算法
  16. XMind 8破解教程
  17. 怎么把WORD中插入的图片改为统一尺寸的,看这里,文档中图片怎么改成同样大小
  18. ramda 函数 Object
  19. 永磁直流无刷电机设计之路(三)——电磁参数设计
  20. 别没事就打开懂车帝了,我的字节跳动懂车帝三面面试经验

热门文章

  1. 深度学习8-加速强化学习训练的方法
  2. .NET/C#程序员技能表
  3. 图解ConcurrentHashMap
  4. 玩转CSS的前生今生与基础语法,选择器的使用
  5. Hadoop基础-镜像文件(fsimage)和编辑日志(edits)
  6. StringUtils 系列之 StringUtils.isBlank() 和 StringUtils.isNotBlank() 的区别、CollectionUtils.isEmpty()
  7. 震惊!让博主彻夜未眠的原因竟是这个(归并排序(c语言))
  8. Linux伪分布式安装Hadoop
  9. 今日作息及食谱(8.6)
  10. 360兼容模式页面错位_解决360浏览器兼容模式的页面显示问题