当前位置: 首页 > 编程日记 > 正文

Android网络编程系列 一 Socket抽象层

在《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及其相关概念。在实际开发中,我们可能会遇到各式各样的问题,遇到问题不可拍,可怕的是我们不了解问题。关于更深更多的知识就得靠自己日积月累了。

转载于:https://www.cnblogs.com/kevinOne/p/4530570.html

相关文章:

HDFS的shell和API操作

1. HDFS的shell操作 hadoop version //查看版本 hadoop fs -appendToFile src(Linux中的文件) dest(hdfs目录下的文件) //追加 hadoop fs -cat file(hdfs目录下的文件) //查看文件内容 Hadoop fs -tail file(hdfs目录下的文件) //查看文件末尾1kb的数据…

C#中的问号用法

在看一些国外牛人写的C#代码时,总是看到会有Boolean?、DateTime?这样的类型,以为是一些新的类型(该类型变量有一些新的属性和方法),后来经过查找相关的资料,发现原来另有微妙。以下是MSDN中对这个问号的解…

L1-006 连续因子

题目: 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。 输入格式: 输…

Python Data Structures

1. list 2. stack 3. queue 4. tuple 5. sequence 6. set 7. dict #-*- coding: utf-8 -*-# 添加中文注释Created on 2011-4-29test for python data structureauthor: xuqiang###################list##################print("test for list");a [66.25, 333, 333…

【转】 ubuntu12.04更新源

原文网址:http://blog.chinaunix.net/uid-26404477-id-3382633.html 摘 要:本文列出ubuntu 12.04 LTS更新源列表,内容为网友整理,此处为转载。因为我还在重庆读书,所以在设置自己的源列表的时候选择了电子科技大学的更…

Ubuntu 上创建常用磁盘阵列

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

L1-009 N个数求和

题目 本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。 输入格式: 输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/…

我的理解:box-sizing

下面是我在博客园找到的,和我遇见的情况很相似,所以摘抄下来,原文见:http://www.cnblogs.com/charling/p/3635031.html box-sizing语法: box-sizing : content-box || border-box || inherit 参数取值: con…

世界最大规模3D打印混凝土步行桥在上海 落成启用

1月12日,世界最大规模3D打印混凝土步行桥在沪落成启用,人们站在桥体上欢庆该新兴建筑体的诞生。 中新网上海1月13日电 (记者 于俊)一座体态优雅、形似飘带的水泥桥12日横跨于上海宝山智慧湾的小河之上,宣告全球最大规模混凝土3D打印步行桥落成…

idea打开web项目之后一直闪烁

解决办法: 点击, 选择第一个(清除缓存并重启) 这时Idea会自动重新启动,之后就没有闪烁的状态了。 一开始我选择是第二个,清除无效的缓存,但是并没有起作用。

第十章:控制文件

控制文件管理[大纲] 控制文件的结构  控制文件的复用  控制文件的重建  控制文件的管理一、数据库控制文件控制文件中记载了数据库的物理结构等重要的数据库信息,如数据文件和日志文件信息。控制文件是用 于维护数据库完整性的重要文件。Oracle 正是使用…

UIImage图片拉伸方法

纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设…

【摘录】GestureDector使用

boolean onDoubleTap(MotionEvent e)解释:双击的第二下Touch down时触发boolean onDoubleTapEvent(MotionEvent e)解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。boolean onDown(MotionEvent e)解释:Touch …

IDEA新建springboot项目发生错误

idea新建spring boot项目 选择这个默认的Default 之后弹出提示框如下 这个时候首先试一下更换一下网络,我用的是wifi就换成热点,就可以了,是因为网络的问题

windows form窗体应用程序,建一个记事本参考代码,重点是打开,保存,另存为...

//当点击打开的时候private string files; //建一个成员变量,用来存储打开的路径private void 打开OToolStripMenuItem_Click(object sender, EventArgs e){//openFileDialog1.Filter "文本文件|*txt|视频文件|*avi;*jpg"; //filter建立一个筛选器//ope…

『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)——基础之后 『参考』.net CF组件编程…

vs2010设置boost开发环境

1. 编译boost类库 2. 设置vs2010的环境 <1>. 编译boost类库 前面一篇文章介绍了如何在linux下建立boost的开发环境&#xff0c;并且编写了一个测试程序&#xff0c;这里将试着在windows下编译boost&#xff0c;同时设置vs2010的开发环境&#xff0c;使用vs来作为开发的…

怎样把字符1变成数字1

直接使用字符bai1减去字符0即可&#xff0c;如&#xff1a;‘1’-0’ 解释&#xff1a; 这样做可行是因为字符0到字符9在ascii编码时是连续的&#xff0c;字符0的ascii值是48&#xff0c;字符1的ascii值是49&#xff0c;其他数字字符依次往后排&#xff0c;而ascii值实际上就…

C#基础篇--文件(流)

1&#xff1a;Path类是专门用来操作文件路径的&#xff08;Path类是静态类&#xff09;&#xff1a;当然用字符串的处理办法也能实现。 string str "C:\Users\成才\Desktop\Hashtable.txt";//返回文件名Console.WriteLine(Path.GetFileName(str));//返回文件名&…

adoquery查询结果如何赋给一个变量(delphi和c++ builder)

我用的是adoquery进行数据库查询&#xff0c;但是我不想把查询的结果显示出来&#xff0c;只是想赋给一个变量&#xff0c;请问我这个变量该怎样去设置呢 &#xff1f; 回复人&#xff1a;sunriver 回复时间&#xff1a;2005-6-3 9:11:00procedure TForm1.Button1Click(Sender:…

pdf格式转换成jpg的简单教程

如何将pdf文件在线免费转换成jpg图片&#xff1f;因为文件保存为图片的形式比较容易查看&#xff0c;因此小伙伴们在编辑完pdf文件之后都会将其保存为jpg图片。那究竟应如何将pdf文件在线转换成图片呢&#xff1f;我们在网上也可以找到很多工具&#xff0c;但是转换效果却是不尽…

npm should be run outside of the Node.js REPL, in your normal shell

错误&#xff1a; npm should be run outside of the Node.js REPL, in your normal shell 在搭建vue环境时报错&#xff0c; 设置缓存文件夹 npm config set cache "D:\vueProject\nodejs\node_cache"和 设置全局模块存放路径 npm config set prefix “D:\vueProjec…

php错误封装类

1、创建MyErrorHandler.php文件 代码如下&#xff1a; <?php class MyErrorHandler {public $message;public $filename;public $line;public $vars array();protected $_noticeLog F:\root\noticeLog.log;public function __construct ($message,$filename,$line,$vars)…

sqlserver 与 mysql 联合更新两个表 区别

sqlserver:UPDATE a SET a.gradeb.id FROM userinfo a,levelinfo b WHERE a.exp>b.minvalue AND a.exp<b.maxvaluemysql:UPDATE userinfo a,levelinfo b SET a.gradeb.id WHERE a.exp>b.minvalue AND a.exp<b.maxvalue转载于:https://www.cnblogs.com/andy_tigger/…

Django web框架

Web框架 web 框架本质 - Web应用本质上就是一个socket服务端&#xff0c;而用户的浏览器就是一个socket客户端。 HTTP协议 HTTP协议介绍HTTP协议对收发消息的格式要求每个HTTP请求和响应都遵循相同的格式&#xff0c;一个HTTP包含Header和Body两部分&#xff0c;其中Body是可…

输入vue ui没反应

在cmd中输入 vue ui没有反应 输入 vue -h查看&#xff0c;发现是版本太低&#xff0c;根本没有ui 这是因为vue的版本太低导致的&#xff0c; 输入cnpm i -g vue/cli 升级脚手架即可 升级完成后&#xff0c;输入vue -h 最后输入vue ui即可

Windows 10 开发日记(五)-- 当Binding遇到异步 -- 解决方案

前文再续&#xff0c;上一章提出了问题&#xff0c;本章提出了三种解决方案&#xff1a; 解决方案一&#xff1a;手动进行异步转换,核心思想:将binding做的事情放入CodeBehind FilterItemControl.XAML: <Grid><Image x:Name"FilterImage" Stretch"Unif…

java实现局域网内单对单和多对多通信的设计思路

这个看起来是很简单的&#xff0c;不就是socket吗&#xff0c;但是&#xff0c;要想有一个好的用户体验&#xff0c;还是很难的&#xff0c;主要问题有&#xff1a; 既然是局域网&#xff0c;那么就必然没有一个固定的IP地址作为主机&#xff0c;这个问题怎么解决&#xff1f; …

GIT - 拉取其他仓库的某个分支的代码

场景 在A仓库拉取B仓库develop分支的代码到A的本地分支 步骤 查看本地已有的远程仓库git remote // 查看远程仓库的名字 发现只有A-v 更加详细的远程仓库说明 复制代码添加远程仓库git remote add BName Bgiturl // 添加远程仓库 BNname别名 Bgiturl远程的git地址 复制代码添…

fetchMetadata: sill install loadAllDepsIntoIdealTree

在搭建vue项目的时候出现报错如下 fetchMetadata: sill install loadAllDepsIntoIdealTree 先输入 npm install -g cnpm --registryhttps://registry.npm.taobao.org 在输入cnpm install