java 聊天室 私聊_使用socket实现网络聊天室和私聊功能
使用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实现网络聊天室和私聊功能相关推荐
- 基于Java socket的网络聊天室的设计与实现
目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...
- c++ socket 多线程 网络聊天室
文章目录 1. 实现图解 2. 聊天室服务端:TCP_Server_Chat.cpp 3. 聊天室客户端:TCP_Client_Chat.cpp 1. 实现图解 2. 聊天室服务端:TCP_Serve ...
- java 友好时间显示_仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]...
本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成"年/月/日 时: ...
- 基于linux网络聊天室的设计,参考基于linux网络聊天室的设计.doc
参考基于linux网络聊天室的设计 长沙理工大学<高级操作系统>课程设计报告学 院 计算机与通信工程 专 业 计算机科学与技术 班 级 学 号 学生姓名 指导教师 课程成绩 完成日期 课程 ...
- java私聊_【转帖】实现了视频私聊功能
[转帖]实现了视频私聊功能 昨天匆忙实现了视频私聊功能,今天把思路再整理下.顺便和各位做个探讨- 我的基本思路是这样的: 1. 用户登录聊天室后在左边的窗口自动显示视频(如果检测到有的话,如果没有则显 ...
- java学习日记(9)———socket,网络编程的学习
---------------------- android培训.java培训.期待与您交流! ---------------------- ----------- 自己学习编程的时候当时还用了不少时 ...
- java 爬虫 百度新闻_基于HttpClient实现网络爬虫~以百度新闻为例
在曾经的工作中,实现过简单的网络爬虫,没有系统的介绍过,这篇博客就系统的介绍以下怎样使用java的HttpClient实现网络爬虫. 关于网络爬虫的一些理论知识.实现思想以及策略问题.能够參考百度百科 ...
- java时序图工具_开源在线绘图工具,界面美观,功能丰富,总有一款适合你
俗话说,一图胜千言,一张小小的图片可以替代大段的文字说明,更可以形象直观地描述业务流程.展示算法...,下面给大家带来几款我最近收藏的开源在线绘图工具. Ant Design Pro 项目地址:htt ...
- java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法
在一个美颜高手那里发现一个美颜算法,他写出了数学表达式,没有给出代码,正好在研究OPENCV,顺手实现之.具体过程就是一系列矩阵运算,据说是从一个PS高手那里研究 出来的,一并表示感谢. 这是数学表达 ...
- java 商品多规格_大家有做过商品多规格的功能嘛?商品的不同规格对应不同价格和库存一般是如何实现的?...
13 2016-02-01 18:16:22 +08:00 4 给你做了个例子 ... 见下 ... mysql> SELECT * FROM `ware_product`; +----+- ...
最新文章
- 【Java】类与对象 - 参数传值
- SDN第三次上机作业
- 美国要求台积电、三星45天内主动交出商业数据,不配合将采取必要行动
- python画代码-Python教程_Python画Mandelbrot集 代码
- sql server 服务器之间传递消息,SQL Server 2008 Service Broker教程 - 无法接收消息(transmission_status中的异常)...
- 详解Vuex常见问题、深入理解Vuex
- Spring MVC 测试 | 模拟提交表单
- Spring4.x(3)---工厂模式设计IOC容器
- mysqlinsert触发器的创建
- SQL:Mongoose在node中的应用
- 用java画工作流流程图,java生成流程图
- 比较5个最佳的PHP表单生成器(和4个免费脚本)
- 思科Cisco vPC技术详解配置
- 数字化汗字中仲字如化数字化_如何将旧的电影照片数字化
- ICCV 2021 Oral | 金字塔视觉Transformer(PVT):用于密集预测的多功能backbone
- R语言数据可视化包ggplot2画图之散点图
- 信息化系统要如何选型?
- 如何解决“由于无法验证发行者,所以WINDOWS已经阻止此软件”
- 在VMware中安装新版Ubuntu后,无法跨虚拟机复制粘贴和拖拽文件的解决方法
- SourceTree的简单使用
热门文章
- 如何创建WooCommerce弹出窗口来增加销售额(6种经过验证的方法)
- ajax ruby,在Ruby on Rails中使用AJAX的教程
- 云部署中的 公有云 私有云 混合云 社区云 基本概念快速掌握
- 利用echart和echart-gl绘制江苏省的地图之二
- 大白菜超级U盘启动盘制作
- 2018俄罗斯世界杯亚洲区12强赛记录
- Dynamsoft Barcode Reader Crack,强大而快速的条码解码
- 万圣节| Huluween“魔幻洞窟”闯关之夜
- 北京 php 外包,=== | php外包与php技术服务商
- 推荐3个快速开发平台 前后端都有 接私活又有着落了