socket通信需要网线连接吗_socket网络编程基础知识篇

网络通信是一种进程间通信(IPC,

Inter-Process

Communication),要求位于不同网络节点不同进程的通信双方必须遵循统一的通信协议方可实现。基于套接字(Socket)通信是应用在不同节点上的进程间通信的典型办法。

1、基本原理

1.1、 Socket API基本概念

Socket

API是TCP/IP网络的API,用于提供IPC通信。下面是socket

API的概念模型。 

Socket是物理网络地址和逻辑端口号的一个集合,通过这个集合可以向另外一个位置的与它具有相同定义的Socket进行数据传输。由于Socket是由机器地址和端口号来识别,那么在一个特定的计算机网络上,每一个socket都是由此方式被唯一标识的,这也使得应用程序可以被唯一定位。socket类型有两种:一个是流式socket,提供进程之间的逻辑链接,并且支持可靠的数据交换;另一个则是数据包socket,无连接且不可靠。

1.2、 JAVA对网络通信的支持

JDK提供的预定义类库支持Java程序直接发送与接收TCP数据段或UDP数据报,并帮助程序员以更直接的方式处理建立在TCP之上的应用层协议HTTP、FTP等。JDK预定义的类均放在程序包java.net中,使用其中哪些类取决于所需要处理的通信协议。例如,基于TCP的应用程序可使用Socket,ServerSocket等类;基于HTTP和FTP等协议直接访问URL资源的应用程序可使用URL、URLConnection等类。

1.3、TCP、UDP与端口

传输控制协议(TCP,

Transfer Control

Protocol)是一种面向连接的传输层协议,可为两台主机上的应用程序提供可靠的数据流连接。所谓”面向连接”意味着两个使用TCP通信的应用程序在交换数据之前必须先建立一个TCP连接,带通信结束后须关闭该连接。这一过程与电话通信类似。TCP执行的任务包括把应用层传来的数据分解为合适的数据段交给网络层,确认接收到的数据分组,设置发送最后确认分组的超时时间等,为应用层屏蔽了实现端到端可靠通信的细节。TCP可保证数据从连接的一端送到另一端时仍能保持原来发送时的次序,否则将出现一个传输错误。TCP为需要可靠通信的应用程序提供了一种点对点信道,在因特网上常见的FTP、SMTP等协议都是建立在TCP的基础上。

用户数据报协议(UDP, User

Datagram

Protocol)不是基于连接的,而是为应用层提供一种非常简单、高效的传输服务。UDP从一个应用程序向另一个应用程序发送独立的数据报,但并不保证这些数据报一定能到达另一方,并且这些数据报的传输次序无保障,后发送的数据报可能先到达目的地。使用UDP协议时,任何必需的可靠性都须由应用层自己提供。UDP适用于对通信可靠性要求低且对通信性能要求高的应用,如DNS、RIP等协议都建立在UDP的基础上。

由于现代计算机大多运行多任务操作系统,故一台主机上可能同时运行多个应用程序进程,并且一个进程还可能使用多个不同的连接,因而仅用主机名或IP地址无法唯一标识数据包的源或目标。端口为标识参与通信的主机、进程与连接提供了一种统一的、唯一的方法。

2、数据报socket

2.1

面向无连接数据包UDP

UDP协议使用数据报式套接字,在数据传输之前不需要先建立连接,UDP没有组装和重传请求的功能,并不保证接收方能够接收到该数据包,也不保证接收方所接收到的数据和发送方所发送的数据在内容和顺序上是完全一致的。其主要工作是将应用程序传输过来的数据分块交给网络层,确认接收到分组信息。 

2.2

面向连接数据包UDP

一般来说,很少用数据报socket实现面向连接通信,因为此API提供的连接非常简单,通常难以满足应用需求。 

3、流式socket

3.1

基本编程原理

流式socket所完成的通信是一种基于连接的通信,即在通信开始之前先由通信双方确认身份并建立一条专用的虚拟连接通道,然后它们通过这条通道传送数据信息进行通信,当通信结束时再将原先所建立的连接拆除。在这个过程中,Server端首先在某个端口提供一个监听Client请求的监听服务,并处于监听状态,当Client端向该Server的这个端口提出服务请求时,Server端课Client端就建立了一个连接和一条传输数据的通道,通信结束时该通道被拆除。 

3.2

单线程服务程序与客户程序

使用基于TCP协议的双向通信时,网络中的两个应用程序之间必须首先建立一个连接,这一连接的两个端点分别被称为socket。由于socket被绑定到某一固定的端口号,故TCP可将数据传输给正确的应用程序。从应用变成的角度看,应用程序可将一个输入流或一个输出流绑定到某一socket,读写这些输入/输出流即可实现基于TCP的通信。

使用网络通信的应用程序普遍采用客户机/服务器计算模型(C/S架构),其中客户程序作为通信的发起者,向服务器提出信息或服务请求;服务程序则负责提供这种信息或服务,服务程序经常在一个无限循环中等待客户程序的请求并执行相应的服务。

在,申请建立一个到服务程序的连接。服务程序在收到某一客户程序的连接请求后,并不是利用对外发布的那个端口号建立与该客户程序的连接,而是另外分配一个新的端口号建立与客户程序之间的连接,原端口号仍用于监听其他客户程序的连接请求,不会因为该端口长期处理客户程序请求而导致其他客户程序阻塞。 

3.3 多线程服务程序

单线程的服务端在同一时刻只能处理一个客户连接,一旦服务程序的accept()被调用,服务程序主线程将持续执行客户程序发来的服务请求,再无其他线程监听服务程序对外发布的端口,导致后续的客户连接请求失败。一种简单的改进途径是当服务程序处理完一个客户连接后再次循环执行accept()。这种改进虽然可以使服务程序在处理完一个客户程序的所有服务请求后,还可继续建立与下一客户程序的连接并处理请求。但在一个客户程序提交的服务请求需占用服务程序较长时间的情况下,其他客户程序的连接请求将进入队列等待,甚至可能因队列溢出而丢失。

另外一种改进途径是使用多线程编程方式,让服务程序的主线程执行监听客户程序连接请求的任务,而处理客户程序服务请求的任务则交由另一个新建的线程负责。

4、应用层协议开发

4.1 应用层协议理解

一般来说,网络协议有三个要素,分别是:语法、语义与规则(时序)。语义规定了通信双方彼此之间准备”讲什么”,即确定协议元素的类型;语法规定通信双发彼此之间”如何讲”,即确定协议元素的格式;变换规则用以规定通信双方彼此之间的”应答关系”,即确定通信过程中的状态变化,通常可用状态变化图来描述。针对应用层协议,此三要素的含义是:语法是消息的语法和描写,语义是指消息的解释或含义,规则是进程间通信的顺序。

4.2 FTP协议开发

文件传输协议FTP(File

Transfer

Protocol)是一个用于在两台装有不同操作系统的计算机之间传输计算机文件的软件标准,工作于应用层。FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流。当数据通过数据流传输时,控制流处于空闲状态。 

FTP协议有两种工作方式:PORT方式和PASV方式,即主动模式和被动模式。主动模式要求客户端和服务器同时打开并且监听一个端口以建立连接,主动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器从20端口向客户端的空闲端口发送连接请求,建立一条数据链路来传送数据。

在主动模式下,客户端可以由于安装了防火墙会产生一些问题,所以创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的过程,这样就可以绕过客户端安装了防火墙的问题。被动模式的连接过程是:客户端向服务器的FTP端口发送请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端向服务器空闲端口发送连接请求,建立一条数据链路来传送数据。

4.3 HTTP协议开发

超文本传输协议HTTP采用典型的”请求-答复”通信模型:客户程序建立与服务器程序的连接后,向服务程序发送一个服务请求;服务程序根据请求获取相应的文档作为答复送回客户程序,最后关闭连接。 

由于在客户程序和服务程序的整个会话过程中可能需要建立多个连接(例如,为获取两个不同URL指定的资源而分别建立两个TCP连接),而不是持久地使用同一TCP连接,故HTTP是一种无状态协议。在HTTP协议的实现中可通过减少TCP连接的建立与次数以提高通信效率,HTTP/1.1的持久连接机制甚至还保证了客户程序与服务程序之间同一类型元素持久地使用同一连接,但HTTP仍不能被视为一种可保持会话状态的协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python柱形图代码_Python数据可视化:基于matplotlib绘制「条形图」

简介 条形图 (bar chart)是用宽度相同条形的高度或长短来表示数据多少的图形,可以横置或纵置。纵置时的条形图也称为 柱形图 (column chart)。 绘制条形图 1 import matplotlib.pyplot as plot 2 3 data [5., 25., 50…

Dreamweaver cs3快捷键大全

新建文档        CtrlN 打开一个 HTML文件   CtrlO或者将文件从[文件管理器]或[站点]窗口拖动到[文档]窗口中 在框架中打开       CtrlShiftO 关闭           CtrlW 保存           CtrlS 另存为         CtrlShiftS 检查链接   …

[JS][前端]修改文件input为button样式

问题描述 在开发的时候&#xff0c;遇到了需要提交表单文件的需求&#xff0c;但是原生<input>标签特别不好看&#xff0c;而且还有点击提交文件的提示&#xff0c;这样很影响美观&#xff0c;于是便想着更改<input>为<button>按钮。 解决方案 建立一个butto…

源码 连接mysql_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...

一&#xff1a;背景 1. 讲故事 最近看各大技术社区&#xff0c;不管是知乎&#xff0c;掘金&#xff0c;博客园&#xff0c;csdn基本上看不到有小伙伴分享sqlserver类的文章&#xff0c;看样子这些年sqlserver没落了&#xff0c;已经后继无人了&#xff0c;再写sqlserver是不可…

ThinkPHP5.1中使用Redis来缓存

问题 在thinkphp5.1项目中需要引入Redis&#xff0c;安装redis后在tp5.1写入相关的操作代码后却一直报错&#xff0c;可能出现的问题如下&#xff1a; 1. 安装不正确&#xff0c;即redis没正常运行 2. 没有添加php_redis驱动扩展 3. php.ini修改位置不正确 4. tp5.1中配置代…

python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子

下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request importurlopenfrom bs4 importBeautifulSoupimportre html urlopen("http://www.cnblogs.com/davidgu") bsObj BeautifulSoup(html, &…

asp.net mvc使用的心得和问题的解决方法(陆续更新ing)

1、在mvc下webform的分页控件不能用&#xff0c;只好自己山寨一个轻便的。 1publicclassPageHelp2{ 3 /**//// <summary> 4 /// 总页数 5 /// </summary> 6 public int TotalPageNum { get; set; } 7 /**//// <summary…

[C++][线程安全]单例模式下双检查锁和线程

问题 在设计模式中&#xff0c;有一个很经典的模式-单例模式&#xff0c;它可能是实现上最简单的模式&#xff0c;在代码中也经常使用&#xff0c;在单线程下&#xff0c;毫无疑问延迟化加载是比较常用的&#xff0c;但是在多线程条件下&#xff0c;单例模式的延迟加载可能就会…

java的ZipOutputStream压缩文件的两个问题(乱码和每次zip后文件md5变化)

java的ZipOutputStream压缩文件的两个问题&#xff08;乱码和每次zip后文件md5变化&#xff09; 1、乱码问题可以使用org.apache.tools.zip 2、md5每次都变化只需要设置entry.setTime(1) posted on 2008-11-20 15:49 夜隼 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cn…

python少儿编程课件ppt_Python课程第五期

{getUnitName} 免费 {getTaskName} 剩余观看时长&#xff1a;{watchLimitRemaining} 回放 {activityStartTimeStr} 正在直播中 直播结束 {activityLength} 免费 {getTaskName} 敬请期待 { "id": "1680", "isDefault": "1", "lear…

h5 一镜到底_这些一镜到底的H5还能怎么玩?

前文《单个公众号收入过亿&#xff0c;条漫为什么成为2019风口》提到&#xff0c;加入插画元素的条漫和ps拼接的长图文正处在2019年风口&#xff0c;这种现象也适合描述H5。以往扁平化的H5内容新颖&#xff0c;但视觉上缺乏大幅度的起伏。想要让H5看起来更有律动&#xff0c;就…

visio生成数据表图

http://blog.163.com/zgkingdom126/blog/static/2273473200892714445447/转载于:https://www.cnblogs.com/lishenglyx/archive/2008/11/24/1339746.html

打开端口_打印机ip及端口设置

越洋帮路由网原创&#xff1a;文章是关于"打印机ip及端口设置"的相关知识分享&#xff0c;希望可以帮到大家。 - 素材来源网络 编辑:小易。随着科学技术的发展&#xff0c;各种技术成果也进入到千家万户&#xff0c;近日&#xff0c;有人咨询怎样设置和修改打印机ip及…

博客搬迁声明

博客搬迁 回过头&#xff0c;在CSDN写博客已经好几年了&#xff0c;当初写博客是为了总结自己的ACM解题思路&#xff0c;开始觉得浪费时间&#xff0c;可是写到了现在&#xff0c;慢慢发现自己爱上了写博客这种爱好&#xff0c;反过来看之前自己的想法的时候&#xff0c;会惊叹…

分计算iv值_快捷、经济、实用的光伏及IV曲线测试仪PVPM 1500X

PVPM 1500X IV曲线测试仪pvpm 1500x (1500V,20ADC)可测量光伏模块以及字符串或阵列的 iv 曲线。通过专利程序, 该设备可以直接在光伏系统的安装位置测量和计算峰值功率 ppk、r 和 rp。计算结果和图表可以显示在内部彩色的 tft 显示屏上。因此, 光伏系统的质量控制可以快速、经济…

Open Source Blog 开源ASP.NET/C# 博客平台 v2.5 发布(提供源码下载)

EntLib.com Blog 开源ASP.NET/C# 博客平台 v2.5 发布&#xff08;提供源码下载&#xff09;基于Subtext v2.0 开源ASP.NET博客系统的中文汉化及定制化开发&#xff0c;EntLib.com 开源博客小组根据用户的反馈意见&#xff0c;不断改进系统。2008年11月22日正式发布 EntLib.com …

2018年新年计划

前言 好久没有来csdn了&#xff0c;转眼就到了2018年了。因为最近一年差不多都在捣鼓个人博客&#xff0c;用了好长一段的wordpress&#xff0c;也折腾了很多&#xff0c;但是很不幸的是今年10月份由于主机商的跑路&#xff0c;我的个人博客遭遇了丢失了数据&#xff0c;然后&a…

兄弟3150cdn加粉后清零_兄弟MFC1618MFC1816 tn1035加粉清零方法

兄弟MFC-1618\MFC-1816 tn-1035加粉清零方法 有今天要发的题目的话؛兄弟MFC-1618\MFC-1816 tn-1035加粉清零方法 墨粉盒型号&#xff1a;兄弟TN-1035兄弟MFC-1618的清零方法有两种&#xff1a;一、清粉盒(转动粉盒右侧的齿轮180度)&#xff1b;二、在机器上操作&#xff1b;(以…

python随机生成字符串_python 随机生成字符串数据

不说话字节贴代码&#xff1a; # -*- coding:UTF-8 -*- print (---------------------------game---------------------------) import re from random import randint, choice from string import lowercase from sys import maxint from time import ctime doms (com, edu, …

扩大swap分区--Ubuntu手记之系统配置

因为安装时采用的自动分区&#xff0c;因此我的swap分区是800多M&#xff0c;最近打算用休眠功能&#xff0c;发现总是不成功&#xff0c;报告swap分区不够大&#xff0c;原来ubuntu是采用swap分区来挂起系统的&#xff0c;而我的机器有2G内存&#xff0c;因此要使用挂起功能就…