使用socket技术实现网络聊天室和私聊功能,具体内容如下

话不多说先上图:

1、聊天室群聊页面

在线用户的联系人列表

socket连接页面

私聊页面

项目介绍

与服务端实现socket连接:每个客户端连接到服务器的时候,服务器会将每个连接的socket保存在list集合中。

群聊功能:当有一个用户发送群聊消息给服务器的时候,服务器会将所有信息转发给list列表中的所有已连接的客户端。

私聊功能:用户发送私聊信息给服务器后,服务器会向一个目标ip发送消息。

显示在线联系人列表:当有新用户登录成功的时候,服务器会将在线联系人的信息用json字符串的形式发送给客户端,客户端通过解析json字符串来获取在线联系人的信息。

自定义一个强大的类SocketEvent:客户端与服务器通信全部都是通过这个类来保存数据的,然后使用fastjson工具来把类对象转换为json字符串来传输。

public class SocketEvent {

private int type =0;

private String msg ="";

private String keyIP =""; // 关键IP

private String temporaryIP =""; // 临时IP

public SocketEvent() {

}

public int getType() {

return type;

}

public void setType(int type) {

this.type = type;

}

public String getMsg() {

return msg;

}

public void setMsg(String msg) {

this.msg = msg;

}

public String getKeyIP() {

return keyIP;

}

public void setKeyIP(String keyIP) {

this.keyIP = keyIP;

}

public String getTemporaryIP() {

return temporaryIP;

}

public void setTemporaryIP(String temporaryIP) {

this.temporaryIP = temporaryIP;

}

}

type: 标志当前发送的信息是什么类型的信息。服务端和客户端解 析数据就是通过这个它来判断属于哪种类型的消息

public static final int CHAT_PRIVATE = 111; // 私聊的指令

public static final int CHAT_GROUP = 222; // 群聊的指令

public static final int SOCKET_SUCCESS = 333; // socket连接成功的指令

public static final int SOCKET_FAIL = 444; // socket连接失败的指令

public static final int CONNECT_SUCCESS = 666; // socket连接成功的指令

public static final int CONNECT_FAIL = 777; // socket连接失败的指令

public static final int LOGIN_ARG = 888; // socket接收到标志新用户登录的指令

public static final int CANCEL_ARG = 999; // socket接收到标志用户注销的指令

public static final int NEW_CLIENT = 3332; // 新用户登录的指令

public static final int ALL_CLIENT = 3432; // 新用户登录后接收到所有在线用户的指令

public static final int SEND_PRIVATE = 5666; // 发送私聊消息的指令

public static final int SEND_IPlIST = 6666; // 发送已登录的用户IP集合的指令

keyIP:客户端消息发起者的ip地址

temperoryIP:临时的IP地址,如果是type是私聊类型的那么这个ip代表的就是目标联系人的ip地址

服务端代码 (ServerSocket)

1. 接收客户端的连接

Socket Socketclient = server.accept();

2.开启线程实时接收来自客户端的信息

// 实时获取客户端发送的数据

@Override

public void run() {

try {

while (true) {

if ((acceptLine = in.readLine()) != null) {

System.out.println("" + acceptLine);

SocketEvent event = JSON.parseObject(acceptLine, SocketEvent.class);

switch (event.getType()) {

case UtilFactory.CHAT_GROUP:

sendMsgAvoid(event.getKeyIP(), acceptLine);

break;

case UtilFactory.SEND_PRIVATE:

event.setType(UtilFactory.CHAT_PRIVATE);

sendMsgTarget(event.getTemporaryIP(), JSON.toJSONString(event));

break;

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

3. 向指定ip发送消息的方法和除了自己ip向其他所有ip发送消息的方法

// 向指定的ip地址发送消息

private void sendMsgTarget(String targetIP, String msg) {

int num = mList.size();

for (int index = 0; index < num; index++) {

Socket mSocket = mList.get(index);

String ip = mSocket.getInetAddress().getHostAddress();

if (ip.equals(targetIP)) {

PrintWriter pout = null;

try {

pout = new PrintWriter(

new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);

pout.println(msg);

// 退出方法

return;

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

// 向除了这个ip以外的所有ip发送

private void sendMsgAvoid(String avoidIP, String msString) {

int num = mList.size();

for (int index = 0; index < num; index++) {

Socket mSocket = mList.get(index);

String ip = mSocket.getInetAddress().getHostAddress();

if (!ip.equals(avoidIP)) {

PrintWriter pout = null;

try {

pout = new PrintWriter(

new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);

pout.println(msString);

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

客户端在mainActivity中接受来自服务端的所有信息,根据type来进行再次分装,使用Eventbus将信息发送给各个fragment来进行展示

@Subscribe(threadMode = ThreadMode.MAIN)

public void privateChat(SocketEvent event) {

switch (event.getType()) {

case MyApplication.CHAT_PRIVATE:

// 将消息post给私聊聊天室

ChatMessageBean bean = new ChatMessageBean();

bean.setMsg(event.getMsg());

bean.setName(event.getKeyIP());

bean.setType(ChatMessageBean.OTHERS_ARG);

EventBus.getDefault().post(bean);

break;

case MyApplication.SEND_PRIVATE:

sendMsg(JSON.toJSONString(event));

break;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java 聊天室 私聊_使用socket实现网络聊天室和私聊功能相关推荐

  1. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

  2. c++ socket 多线程 网络聊天室

    文章目录 1. 实现图解 2. 聊天室服务端:TCP_Server_Chat.cpp 3. 聊天室客户端:TCP_Client_Chat.cpp 1. 实现图解 2. 聊天室服务端:TCP_Serve ...

  3. java 友好时间显示_仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]...

    本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成"年/月/日 时: ...

  4. 基于linux网络聊天室的设计,参考基于linux网络聊天室的设计.doc

    参考基于linux网络聊天室的设计 长沙理工大学<高级操作系统>课程设计报告学 院 计算机与通信工程 专 业 计算机科学与技术 班 级 学 号 学生姓名 指导教师 课程成绩 完成日期 课程 ...

  5. java私聊_【转帖】实现了视频私聊功能

    [转帖]实现了视频私聊功能 昨天匆忙实现了视频私聊功能,今天把思路再整理下.顺便和各位做个探讨- 我的基本思路是这样的: 1. 用户登录聊天室后在左边的窗口自动显示视频(如果检测到有的话,如果没有则显 ...

  6. java学习日记(9)———socket,网络编程的学习

    ---------------------- android培训.java培训.期待与您交流! ---------------------- ----------- 自己学习编程的时候当时还用了不少时 ...

  7. java 爬虫 百度新闻_基于HttpClient实现网络爬虫~以百度新闻为例

    在曾经的工作中,实现过简单的网络爬虫,没有系统的介绍过,这篇博客就系统的介绍以下怎样使用java的HttpClient实现网络爬虫. 关于网络爬虫的一些理论知识.实现思想以及策略问题.能够參考百度百科 ...

  8. java时序图工具_开源在线绘图工具,界面美观,功能丰富,总有一款适合你

    俗话说,一图胜千言,一张小小的图片可以替代大段的文字说明,更可以形象直观地描述业务流程.展示算法...,下面给大家带来几款我最近收藏的开源在线绘图工具. Ant Design Pro 项目地址:htt ...

  9. java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法

    在一个美颜高手那里发现一个美颜算法,他写出了数学表达式,没有给出代码,正好在研究OPENCV,顺手实现之.具体过程就是一系列矩阵运算,据说是从一个PS高手那里研究 出来的,一并表示感谢. 这是数学表达 ...

  10. java 商品多规格_大家有做过商品多规格的功能嘛?商品的不同规格对应不同价格和库存一般是如何实现的?...

    13 2016-02-01 18:16:22 +08:00   4 给你做了个例子 ... 见下 ... mysql> SELECT * FROM `ware_product`; +----+- ...

最新文章

  1. 【Java】类与对象 - 参数传值
  2. SDN第三次上机作业
  3. 美国要求台积电、三星45天内主动交出商业数据,不配合将采取必要行动
  4. python画代码-Python教程_Python画Mandelbrot集 代码
  5. sql server 服务器之间传递消息,SQL Server 2008 Service Broker教程 - 无法接收消息(transmission_status中的异常)...
  6. 详解Vuex常见问题、深入理解Vuex
  7. Spring MVC 测试 | 模拟提交表单
  8. Spring4.x(3)---工厂模式设计IOC容器
  9. mysqlinsert触发器的创建
  10. SQL:Mongoose在node中的应用
  11. 用java画工作流流程图,java生成流程图
  12. 比较5个最佳的PHP表单生成器(和4个免费脚本)
  13. 思科Cisco vPC技术详解配置
  14. 数字化汗字中仲字如化数字化_如何将旧的电影照片数字化
  15. ICCV 2021 Oral | 金字塔视觉Transformer(PVT):用于密集预测的多功能backbone
  16. R语言数据可视化包ggplot2画图之散点图
  17. 信息化系统要如何选型?
  18. 如何解决“由于无法验证发行者,所以WINDOWS已经阻止此软件”
  19. 在VMware中安装新版Ubuntu后,无法跨虚拟机复制粘贴和拖拽文件的解决方法
  20. SourceTree的简单使用

热门文章

  1. 如何创建WooCommerce弹出窗口来增加销售额(6种经过验证的方法)
  2. ajax ruby,在Ruby on Rails中使用AJAX的教程
  3. 云部署中的 公有云 私有云 混合云 社区云 基本概念快速掌握
  4. 利用echart和echart-gl绘制江苏省的地图之二
  5. 大白菜超级U盘启动盘制作
  6. 2018俄罗斯世界杯亚洲区12强赛记录
  7. Dynamsoft Barcode Reader Crack,强大而快速的条码解码
  8. 万圣节| Huluween“魔幻洞窟”闯关之夜
  9. 北京 php 外包,=== | php外包与php技术服务商
  10. 推荐3个快速开发平台 前后端都有 接私活又有着落了