android 基于java的Socket通信的多人聊天分析

来源:互联网 发布:页游进阶数据 编辑:程序博客网 时间:2024/06/16 17:51

     socket,中文翻译为套接字,指的是tcp层,也就是osi计算机七层模式中的第二层——运输层,所使用的数据包交换方式,在运输层,通信双方通过一个套接字连接,这个套接字就好像一根水管,通信双方通过这根水管交换’水‘--也就是数据。

  我们首先看看类似qq这样的即时通信有什么需求,我们知道,在应用层的协议中,大部分是通过c/s,或者是b/s结构来实现的,这个意味着数据的交换是一端主动请求和一端被动响应构成的,一般是我们的客户机请求服务器的服务。那么试想当我们向好友发送一条即时信息时,我们将信息传入服务器,服务器却无法将数据发送给我们的朋友,至少不能即时发送,因为服务器不能请求客户机,只有客户机主动询问是否有我的信息的时候服务器才能将信息交付给客户机。这是不即时的,当然,每秒一个http询问请求也可以实现目的,但是考虑到http报文的内容的额外开销,这样做显然不经济。

这个时候我们就可以考虑面向连接的面向字节流的TCP层协议,其实应用层的协议都是在此基础之上形成的(这里指运输层,不单指tcp协议,实际上tcp层还有udp协议,是无连接的)。在服务器和连接到聊天室的客户机之间建立一条连接,这样当客户机传输数据过来的时候,就好像水管里的水流出来,流进了服务端程序,服务端程序将这些水放进连向目的地的那根水管,就流到了目的地,实现了服务器主动传输数据给客户机的操作,

接下来是程序的伪代码,部分代码讲解以java为例


服务端

程序初始化

获取套接字服务对象//SocketServer ss=new SocketServer(30022);

监听服务端的连接//Socket s=ss.accept();

启动线程监听这个连接的数据交互//具体方式是在线程里的run方法监听,不关闭连接的流


客户端:

程序初始化

建立连接Socket s=new Socket("host",port);

建立线程,线程的run方法就从handler里面取数据交给服务器,同时再开启一个线程读取来自服务器的信息


0 0
原创粉丝点击