在《Android网络编程》系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象层。本篇文章将会让我们清楚的了解和学会使用Socket。

    什么是Socket?它又是如何运作的?它的表现形式是什么?等等这些问题,本篇文章将逐步的揭晓。
 
一. 什么是Socket
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,你可以借助它建立TCP连接等等,而http是个应用层的协议,它实际上也建立在TCP协议之上。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
 
    然而Socket本身并不是协议,它只是对TCP/IP协议的封装,是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。
 
二. 它是如何运作的?
    首先我们来看下其内部的通信原理,如图:
 
 
    一台主机的应用程序C要能和另一台主机的应用程序S通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。
 
    建立Socket连接至少需要一对套接字,其中一个运行于客户端程序C中,称为ClientSocket ,另一个运行于服务器端程序S中,称为ServerSocket 。套接字之间的连接过程分为三个步骤:服务器等待监听,客户端请求,连接建立。

1>.服务器等待监听:ServerSocket 并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。该过程是一个阻塞过程,直到有客户端来链接为止。

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

3>.连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
    在创建 Socket 实例的构造函数正确返回之前,将要进行 TCP 的三次握手协议,TCP 握手协议完成后,Socket实例对象将创建完成,否则将抛出 IOException 错误。具体的三次握手协议可以看《Android网络编程 一 JavaSecurity之JCE(SSL/TLS)》
 
三. 它的表现形式是什么?
    以上讲述的都属于JAVA I/O 范畴,我们可以看出I/O编程中我们用的就是Socket 和 ServerSocket,通信的数据靠Socket之间的流通道,其次在调用InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超时)才会返回;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU时间。所以Java NI/O编程就应运而生,它能够很好的解决这些。NI/O编程可以说成非阻塞式I/O,java NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream),在通道上可以注册我们感兴趣的事件。一共有以下四种事件:比如读、写、客户端链接事件、服务端接收链接事件。NI/O 它由一个专门的线程来处理所有的 I/O 事件,并负责分发。 事件到的时候触发,而不是同步的去监视事件。 线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。 Channels、Buffers 、Selectors 三个NIO编程的核心类。关于NIO本篇文件就不多说了,大致的介绍下。 除此之外,它的另外一种表现形式就是在其原有的基础上(socket 和 serversocket)加上了一层安全保护也就是SSL/TLS协议保护层。关于这一层的介绍可以参考《Android网络编程 一 JavaSecurity之JCE(SSL/TLS)》
 
四. 小结
   以上呢就大致的讲述了Socket及其相关概念。在实际开发中,我们可能会遇到各式各样的问题,遇到问题不可拍,可怕的是我们不了解问题。关于更深更多的知识就得靠自己日积月累了。

Android网络编程系列 一 Socket抽象层的更多相关文章

  1. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  2. Android网络编程系列 一 TCP/IP协议族之传输层

    这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 传输层中有TCP协议与UDP协议. 1.UDP介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,U ...

  3. Android网络编程系列 一 TCP/IP协议族之链路层

    这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RA ...

  4. Android网络编程系列 一 TCP/IP协议族之网际层

    这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 网际层包括:IP.ICMP.IGMP 以及处在网际层实际工作在链路层的 ARP 和 RARP等等协议. 1.IP协议 互联网 ...

  5. Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

    摘要:     Java Security在Java存在已久了而且它是一个非常重要且独立的版块,包含了很多的知识点,常见的有MD5,DigitalSignature等,而Android在Java Se ...

  6. Android网络编程系列之Volley总结

    前言 Volley的中文翻译为“齐射.并发”,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理.小图片的异步加载和缓存等功能,能够帮助 Android AP ...

  7. Android网络编程系列之HTTP协议原理总结

    前言 作为搞移动开发的我们,免不了与网络交互打交道.虽然市面上很多开源库都封装的比较到位,我们实现网络访问也轻车熟路.但还是十分有必要简要了解一下其中的原理,以便做到得心应手,也是通往高级开发工程师甚 ...

  8. 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层

    目录 网络架构及其演变过程 单机架构 CS架构 BS架构 BS架构和CS架构的区别 C/S架构的优缺点: B/S架构的优缺点: 互联网与互联网的组成 互联网的组成(教科书版) 互联网的组成(科普版) ...

  9. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...

随机推荐

  1. 每日一九度之 题目1042:Coincidence

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3007 解决:1638 题目描述: Find a longest common subsequence of two strings. 输入 ...

  2. 【转】身份证号码校验与信息提取 - Java 代码

    转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148 import java.util.regex.*;   /**   ...

  3. 如果在遨游浏览器里设置Bing(必应)搜索为默认搜索

    今天刚装了遨游浏览器,发现搜索引擎列表里没有Bing(必应)搜索的选项,就自己DIY了下. 步骤: 1. 在遨游搜索引擎列表管理里,添加一个新的搜索引擎项: Name:填写上”Bing(必应)“ (这 ...

  4. 精通 ASP.NET MVC 4 学习笔记(一)

    这里记录着从 P132 到 P192 的内容.水分很足,大部分是书上的代码,我只加了一些基于我自己的理解的能帮助初学者看懂的注释,并且把书中的部分内容做了一些的拓展. 建立数据层 设置 DI 容器 / ...

  5. ceil floor函数

    > a=6.4> b=math.ceil(a)> print(b)7> c=math.floor(a)> print(c)6 ceil向上取整 floor向下取整

  6. C++中的const详解

    const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...

  7. 加载页面(Loading)

    /* 文件说明:页面加载时Loading JS 文件描述:解决IE或FF下,初始化加载时,页面布局乱掉的问题,参考:*/var width = $(window).width();var height ...

  8. 2016年11月27日 星期日 --出埃及记 Exodus 20:18

    2016年11月27日 星期日 --出埃及记 Exodus 20:18 When the people saw the thunder and lightning and heard the trum ...

  9. qt 2 打开文件选择框

    QString sFileName = ""; sFileName = QFileDialog::getOpenFileName(this,tr("Open") ...

  10. 学习笔记TimePicker

    new TimePickerDialog(this, new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view ...