1、即时通讯简介

即时通讯(Instant Messaging,简称IM)是一个终端服务,允许两人或者多人通过网络即时传递文字讯息、档案、语音等。简单的概括就是发送消息时,只要对方在线,就能立即接收到消息。即时通讯的底层使用socket实现。即时通讯按使用用途分为企业即时通讯和网站即时通讯,根据装载的对象又可分为手机即时通讯和PC即时通讯,手机即时通讯代表是 微信、 QQ、 短信、陌陌 。
在这篇文章中,利用Socket+IO流+Thread线程+监听器的知识,简单的实现了点对点的即时通讯,功能比较丑陋,但是底层实现原理是非常重要的,希望这篇文章对初学者能有所帮助,大神勿进、勿喷。
本项目的效果图如下
         
         

2、初识Socket

所谓的Socket通常称为套接字,用于描述IP地址和端口,是一个通信连的句柄。应用程序通过套接字向网络发送请求,或者应答网络请求。 Socket套接字,其实就是Java对TCP/IP的实现,Socket和ServerSocket可以形象的比喻为插头和插座,ServerSocket插座提供电源,是服务端;Socket插头要得到电源,是客户端。Socket网络通讯传输数据的过程就好比插头获取插座电源的过程。
服务端:利用ServerSocket监听指定的端口,等待客户端的连接请求,客户端建立连接之后,产生会话,完成会话后,关闭连接。
客户端:利用Socket向网络上的某一个端口发出连接请求,一旦连接成功,产生会话,完成回话之后,关闭连接。
服务端接收消息代码
/*** socket服务端* * @author ZHY* */
public class ServerSocketTest {public static void main(String[] args) throws IOException {final ServerSocket server = new ServerSocket(8090);System.out.println("服务器已经启动" + server);// 开启一个线程,时刻监听客户端发送过来的连接请求new Thread() {public void run() {super.run();while (true) {try {Socket client = server.accept();// 服务器接收到链接进来的客户端System.out.println("有客户端链接进来" + client);// 处理接收到的数据// 由于服务器不知道客户端什么时候发送数据过来,所以要创建等待线程,时刻等待处理客户端发送过来的额数据WaitThread waitThread = new WaitThread(client);waitThread.start();} catch (IOException e) {e.printStackTrace();}}}}.start();}// 等待线程public static class WaitThread extends Thread {private Socket client;// 服务端使用输入流读取数据private DataInputStream reader;// 在构造等待线程的时候,给客户端赋值public WaitThread(Socket client) {super();this.client = client;}public void run() {super.run();// 循环等待处理数据while (true) {if (reader == null) {// 根据客户端发来的输入流,创建服务器读取数据的流readertry {reader = new DataInputStream(client.getInputStream());} catch (IOException e) {e.printStackTrace();}}try {String msg = reader.readUTF();System.out.println(msg);} catch (IOException e) {e.printStackTrace();}}}}}

客户端发送消息代码

/*** Socket客户端* @author ZHY**/
public class MainActivity extends Activity {private Button client;private Button send;private Socket socket;private DataOutputStream writer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);client = (Button) findViewById(R.id.client);// 连接服务器send = (Button) findViewById(R.id.send);// 发送数据client.setOnClickListener(new OnClickListener() {public void onClick(View v) {// 连接服务器,与网络有关,要在子线程中new Thread() {@Overridepublic void run() {super.run();try {// 创建socket,连接服务器socket = new Socket("192.168.0.148", 8090);} catch (Exception e) {e.printStackTrace();}}}.start();}});send.setOnClickListener(new OnClickListener() {public void onClick(View v) {// 客户端向服务端发送消息,通过输出流,在子线程中new Thread() {@Overridepublic void run() {super.run();if (socket == null) {// 创建socket,连接服务器try {socket = new Socket("192.168.0.148", 8090);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 已经建立了连接if (writer == null) {try {writer = new DataOutputStream(socket.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// writer也不是空try {writer.writeUTF("我是客户端发送的数据" + socket);} catch (IOException e) {e.printStackTrace();}}}.start();}});}
}

客户端与服务端的数据交互会话示意图


至此,Socket的基本原理已经交代清楚,了解了底层实现的原理,相信对即时通讯的理解将更深一步。
PS:如果有什么不妥的地方希望大神指出,共同学习进步!!!

Android即时通讯--仿QQ即时聊天:(一)初识Socket相关推荐

  1. Android即时通讯--仿QQ即时聊天:(五)聊天模块

    1.复杂ListView的展示 聊天模块其实就是一个复杂的ListView,在数据适配器中,从application中获取到当前登录的用户,与聊天消息中的from参数进行比较,如果两者相同则说明是自己 ...

  2. 基于环信的仿QQ即时通讯的简单实现

    代码地址如下: http://www.demodashi.com/demo/11645.html 我的博客地址 之前一直想实现聊天的功能,但是感觉有点困难,今天看了环信的API,就利用下午的时间动手试 ...

  3. winform服务器消息推送,winform项目——仿QQ即时通讯程序12:服务端程序补充及优化...

    原标题:winform项目--仿QQ即时通讯程序12:服务端程序补充及优化 上一篇文章大概完成了服务端程序,今天继续做项目的时候发现还有一些功能没有做,还有几处地方不够完善.不做好就会影响客户端程序的 ...

  4. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  5. 仿微信 java IM即时通讯 | uni-app IM即时通讯 | vue IM即时通讯桌面端 | 源码出售

    仿微信 uniapp IM 即时通讯 源码 & 即时通讯知识小科普 源码,不加密,方便二开! 私有云服务,高效稳定,数据安全,无第三方服务 拓展性强,可拓展任意的消息体类型! 性能优秀,资源足 ...

  6. IM通讯 即时通讯 交友源码 聊天源码

    IM通讯 即时通讯 交友源码 聊天源码 web端+wap端+H5端+安卓端+IOS端+全开源 编号:16150665877560702可可网络

  7. 即时通讯:IM即时通讯实现原理

    即时通讯:IM即时通讯实现原理 IM技术概念 即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种 ...

  8. 即时通讯源码-即时通讯集群服务免费-通讯百万并发技术-Openfire 的安装配置教程手册-哇谷即时通讯集群方案-哇谷云-哇谷即时通讯源码

    即时通讯源码-即时通讯集群服务免费-通讯百万并发技术-Openfire 的安装配置教程手册-哇谷即时通讯集群方案-哇谷云 1,openfire开发环境配置 很久没有写点东西了.最近很烦心,领导不给力. ...

  9. Android开发之仿QQ表情实现(上)

    大家晚上好,,小鹿又来了..最近小鹿特别忙,忙到没时间发表博客了(注:以下内容过于简单请大家不要喷,仅提供初学者学习) 今天发表两篇文章,分别是讲解模拟QQ表情的实现,先给大家看效果图,,,, 开始了 ...

最新文章

  1. Thunk 函数的含义和用法
  2. 深究AngularJS——ui-router详解
  3. 中怎样载入选区_【平面设计教学】Photoshop基本教学-第3章 选区与填色
  4. go程序开发注意事项
  5. Java就业前景怎么样?值得学吗?
  6. Mysql数据库——sql基本语句
  7. POJ1321(KB1-A 简单搜索)
  8. 嵌入式操作系统内核原理和开发(事件)
  9. 条码扫描二维码扫描——ZXing android 源码简化
  10. Qt总结之四:读取文件夹所有文件
  11. Adapter(适配)
  12. 公司内网与外网连通中的一些小问题(达内)
  13. Oracle、plsql安装以及使用教程
  14. 计算机辅助翻译入门第十章课后答案,计算机辅助翻译简明教程
  15. 史上最全股票指标图文详解(原创)
  16. Django models Fild详解
  17. 李阳和他的疯狂英语(r5笔记第46天)
  18. 从“无影”看云电脑的未来
  19. Javascript-实现全局事件总线Event Bus/ Event Emitter
  20. 动态主机配置协议(DHCP)

热门文章

  1. bios密码解锁软件_超详细的CFG解锁教程,带你进完善oc引导,提升黑苹果性能
  2. spring boot使用jasypt加密原理解析
  3. C10K 问题引发的技术变革
  4. 操作无法完成错误0x0000709再次检查打印机名称解决方法!
  5. jmeter压测学习28-监听器之用表格察看结果(View Results in Table)
  6. 周鸿祎:论互联网大佬的编程能力,我能排进前三!
  7. vue项目搭建以及环境配置
  8. JavaPoet 的使用
  9. html侧边导航栏跟随页面滚动,javascript练习:导航随内容滚动而跟随变化
  10. java list逆序_Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用...