Android开发--IM聊天项目(一)

IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换 IM即时通讯项目讲解(一)–实现类似qq微信表情面板无缝切换标签 阅读详情

在知乎上看了一篇文章,感觉受益匪浅。认真迭代一个项目比盲目的多写几个app的收益会更大,还有就是认真的夯实基础,拿offer面试的时候也会更注重基础,还有半年的时间来准备,也就不打算再写其它的项目了,博客方面的话就不定期来写写最近的学习心得,还有这个项目的进展吧。每篇文章的最后都会分析一下目前的缺点以及短期计划。
项目方向:IM(Instant Messenge)聊天项目
项目要求:Android端:UI、消息持久化(读写、缓存)、长链接网络(解决NAT 超时、DHCP续租、参考TLS1.3的安全机制、私有协议设计、大文件分片、失败重试机制设计)、多线程、消息推送、消息同步等。
服务端:持久化(表设计、分库机制)、发送队列、连接管理、并发、负载均衡等。

下面开始进入正文:截至本篇文章、已经实现了网页端、服务器端(NodeJs)、和android端的最简单基础的功能,只能够实现简单的聊天。网页地址为:http://www.spwannasing.cn:4000/ 网页端目前只打算用来测试、不会过多的投入。
如此迅速的就能实现三个端的核心功能,还是用了不少外部库和框架的。比如android端,用了一个socket的支持库,实现和服务器连接。这一点要反思,下面几天要研究一下这个socket源码,还有就是相关的一些传输协议、原来太年轻不重视的计算机网络的基础知识还是相当重要的,切记切记啊。
先来看一下服务端,直接上代码:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    users = [];
app.use('/', express.static(__dirname + '/www'));
server.listen(process.env.PORT || 4000);
io.sockets.on('connection', function(socket) {
    socket.on('login', function(nickname) {
        if (users.indexOf(nickname) > -1) {
            socket.emit('nickExisted');
        } else {
            //socket.userIndex = users.length;
            socket.nickname = nickname;
            users.push(nickname);
            socket.emit('loginSuccess');
            io.sockets.emit('system', nickname, users.length, 'login');
        };
    });
    //user leaves
    socket.on('disconnect', function() {
        if (socket.nickname != null) {
            //users.splice(socket.userIndex, 1);
            users.splice(users.indexOf(socket.nickname), 1);
            socket.broadcast.emit('system', socket.nickname, users.length, 'logout');
        }
    });
    //new message get
    socket.on('postMsg', function(msg, color) {
        socket.broadcast.emit('newMsg', socket.nickname, msg, color);
    });
    //new image get
    socket.on('img', function(imgData, color) {
        socket.broadcast.emit('newImg', socket.nickname, imgData, color);
    });
});

代码很清晰简单,首先是监听4000端口,然后用socket通讯,监听 对应String事件。也没有什么数据库和持久化,所以直接emit出去信息就可以了。

知识点:利用Socket建立网络连接的步骤

  建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

  套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

  1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

  2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。

  为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

  3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。

  而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
然后是网页端:就展示与服务器交互的一部分吧,其余的给出GitHub:https://github.com/CallMeSp/MyChattingRoom_backend-Webend.git 服务器端和网页端的内容都在里面。

window.onload = function() {
    var hichat = new HiChat();
    hichat.init();
};
var HiChat = function() {
    this.socket = null;
};
HiChat.prototype = {
    init: function() {
        var that = this;
        this.socket = io.connect();
        this.socket.on('connect', function() {
            document.getElementById('info').textContent = 'get yourself a nickname :)';
            document.getElementById('nickWrapper').style.display = 'block';
            document.getElementById('nicknameInput').focus();
        });
        this.socket.on('nickExisted', function() {
            document.getElementById('info').textContent = '!nickname is taken, choose another pls';
        });
        this.socket.on('loginSuccess', function() {
            document.title = 'hichat | ' + document.
安卓 基于云信IM实现登录 + 添加好友 + 单人聊天 功能 #开发前准备 首先注册一个开发者账号,再创建自己的app,自动生成app对应的appkey,去app管理界面创建调试账号 #正文 ##配置 创建好项目后,对项目进行配置,官网的帮助文档已经详细说明 ##Application类 // An highlighted block public void onCreate() { super.onCreate(); // ... 阅读详情

相关推荐

Flutter极速接入IM聊天功能并支持鸿蒙

Flutter快速接入聊天,并适配鸿蒙

王氏秘籍 1465

Android直播软件开发中接入腾讯IM大概流程是怎样的

现阶段来看,直播软件中的即时通讯是非常重要的一个部分,毕竟直播过程中的交流和沟通是非常重要的,所以在Android直播软件开发时需要接入相关的IM服务。 通常我们选择的即时聊天服务,会选择集成简单方便、系统稳定、可靠性好、开发成本小的一方,目前比较常见的IM服务商有极光、环信、腾讯、融云等等,本文以选择腾讯IM为例,简单说下如何在Android直播软件开发时集成腾讯IM。 先登录腾讯云官网 htt...

云豹直播源码 1577

融云IM开发准备(Android)

融云开发者的准备相关

duanymin的专栏 3396

记一次完整手机APP项目的开发

写在前面从2015年12月开始到2017年3月在一个创业团队完整参与了一个运动类的手机APP的开发,虽然最后这个项目失败了但是我学到了很多东西,现在已经过去一段时间了可能已经忘记了一部分细节的东西了但是希望通过博客的方式能把我那段时间学习到的东西记录下来,虽然还有整个项目开发过程中的一些波折,但是我还是主要想分享技术,接下来我想写的都是纯干货~项目背景运动页是一个体育类的手机APP,拥有IOS客户端

超纯的小白兔 1万+

关于android引入腾讯即时通信im

Android引入腾讯im即时通信 一、运行官方demo遇到的问题? 在运行官方demo时,可能出现提示某个插件不存在,而大概率时因为整个demo中,并没有使用到该插件; 1、当第一次进入时,demo很大可能性,会引入企业版的依赖,但是,项目中并不存在; 当你正常运行项目时,可能会报如下错误; 2、 解决办法 2.1:如果第一次进来加载entetprise的时候,把它x掉 2.2:在build.app时,改为如下,并不直接依赖com.5.1.1 api ‘com.tencent.liteav:LiteA.

码农小宋 3516

Android即时通讯开发总结

本文分析了移动端IM(即时通讯)的实现方案及关键技术难点。主要介绍了三种实现方式:使用第三方SDK(如环信、融云等)、基于XMPP协议自建(Spark+Smack+Openfire)以及利用推送SDK实现。重点探讨了移动端IM面临的挑战:流量优化(协议选择、图片压缩)、耗电控制(心跳策略)、网络连接稳定性等问题。在架构设计方面,详细阐述了连接器性能优化、中间件设计、逻辑服务器划分、状态同步机制以及数据库分区等核心问题。

学无止境 2901

机器人抓取(一)—— ROS MoveIt! 程序控制真实UR5机器人运动(python)

接上篇:ubuntu18.04 ros-melodic 安装 ur_robot_driver,驱动真实的 ur5 机器人 上文在 ubuntu 系统中配置了ur 机器人ros功能包 universal_robot 和驱动 Universal_Robots_ROS_Driver,并实现了用 moveit_rviz 拖动机器人运动。本文旨在学习如何使用 moveit python 用户接口moveit_commander,实现真实的ur5 机器人轨迹规划与控制。 1. ur5 机器人控制 参考:MoveIt »

zxxRobot的博客 1万+

智能驾驶感知模块评测实战:如何用回灌测试提升BEV模型准确率(附数据集处理技巧)

本文深入探讨了如何通过诊断型回灌测试系统性地提升智能驾驶BEV感知模型的准确率与鲁棒性。文章详细拆解了从场景切片、时空对齐到多维指标分析的完整评测流水线,并针对BEV模型特有的深度估计、特征融合等环节提供了优化思路,旨在帮助工程师将海量路采数据转化为精准的模型迭代燃料。

weixin_29045585的博客 395

一、qt下载与安装

qt与qtcreator 的区别与联系 1、QT Creator只是一个集成的编译器,用于将源代码编译成可执行程序。 QT 是跨平台C++图形用户界面应用程序开发框架,可以简单理解成是一个开发包。 2、Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。 QT Creator 跨平台的 Qt IDE,Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集 ...

yiye_pianzhou的博客 2218

国密https握手协议抓包及流程详解

使用的密码套件清单-Cipher Suite,这里服务器端选择了ECC_SM4_CBC_SM3密码套件,也就是SM2公钥算法、SM4-CBC分组密码算法和SM3杂凑算法。具体来说,这里SM2算法密钥交换算法,SM4是加密算法(SM4-CBC)、SM3是校验算法(国标要求为HMAC-SM3)。服务器的加密证书:加密证书中在同样在扩展字段中KeyUsage标识出KeyEncipherment为true和dataEncipherment为true,即数字证书中包含的公钥可用来做密钥加密密钥和数据密钥。

ryanzzzzz的博客 5847

十四种逻辑器件综合对比——《器件手册--逻辑器件》

逻辑器件是数字电路中最基本的逻辑单元,用于实现基本的逻辑运算,如与、或、非、异或等。逻辑门根据输入信号的组合产生相应的输出信号。与门:只有当所有输入信号都为高电平时,输出才为高电平。或门:只要有一个输入信号为高电平,输出就为高电平。非门:输出信号与输入信号相反。异或门:当两个输入信号不同时,输出为高电平;相同则输出为低电平。用于对输入信号进行反相操作,即将高电平转换为低电平,低电平转换为高电平。常用于信号的反相处理和逻辑电平的转换。

XU157303764的博客 2028

Autosar诊断实战系列23-NRC优先级解析

NRC分类,优先级判断逻辑及测试注意事项介绍。

initiallizer的博客 2617

Docker Desktop 从 C 盘迁移到 D 盘的正确方法

本文介绍了三种将Docker数据目录从C盘迁移到D盘的方案。方案1针对WSL2用户,通过导出/导入虚拟磁盘实现迁移;方案2采用软链接方式,适合所有Docker模式;方案3则建议重装Docker到D盘。其中WSL2迁移方案(方案1)最为稳定可靠,推荐使用。文章详细说明了各方案的操作步骤及注意事项,并提供了迁移后常见问题的解决方法,帮助用户彻底解决Docker占用C盘空间的问题。

sg_knight的专栏 2176

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: Android学习笔记(十二)--自己来实现CircleImageView
下一篇: Android开发--IM聊天项目(二)
CallMeSP
博客等级 码龄10年 48粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值