套接字详解(socket)
用户认为的信息之间传输只是建立以两个应用程序上,实际上在TCP连接中是靠套接字来作为他们连接的桥梁。
那么什么是套接字呢?
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字用(IP地址:端口号)表示,区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。
python中的套接字
python中引用套接字的模块是socket,在服务端和客户端间的信息传输中,套接字起到了决定性的作用,因其功能不同共分为三种套接字,一个是监听套接字,在服务端负责一直监听着客户端是否有请求发来;一种是客户端套接字,负责与服务端建立联系并收发信息;最后一种是对等连接套接字,是在服务端和客户端负责收发信息。
上图中出现了双工这个词,那么什么是单工、半双工、全双工呢?
根据通信双方的分工和信号传输方向可将通信分为三种方式:单工、半双工与全双工。单工数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播。半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。全双工数据通信允许数据同时在两个方向上传输,举例:电话通信。
用代码实现服务端与客户端通信
服务端代码如下:
import socket
server = socket.socket()
server.bind(('127.0.0.5',8520))
server.listen(5)
while True:
a,b = server.accept()
while True:
date = a.recv(1024)
if date:
print("已收到信息-->{}".format(date.decode()))
a.send(date)
else:
a.close()
break;
客户端代码如下:
import socket
client = socket.socket()
client.connect(('127.0.0.5',8520))
mess = input('--->').encode()
client.send(mess)
print("已收到信息-->{}".format(client.recv(1024)))
client.close()
客户端效果:
--->hello,world!
已收到回应-->b'hello,world!'
服务端效果:
已收到信息-->hello,world!
代码详解
服务端实现上述效果流程:
- 创建套接字,即实例化。server = socket.socket()
- 绑定地址,且地址是一个元组,里面包括ip和端口,为自己创建了一个地址,用于客户端的连接。server.bind(('127.0.0.5',8520))
- 开始监听,此时的套接字server才被真正叫做监听套接字,自此之前,客户端是无法连接过来的。代码中的5表示最大能同时连接到客户端的数量。server.listen(5)
- 收到连接请求就建立与客户端连接,返回结果由两个变量接收,第一个变量是对等连接套接字,第二个是客户端的地址(ip和端口)a,b = server.accept(),这里要特别注意是会有阻塞现象,阻塞在下面介绍。
- 利用对等连接套接字开启接收信息状态。若接到空值,表示客户端已主动断开连接。这里也会产生一次阻塞,客户端是无法发送空值的。代码的1024表示可以接收的最大字节数。a.recv(1024)
- 信息传递讲究一收一发,一发一收。若收到信息,应给客户端一个回复。这里要注意的是信息的传递是以字节的形式。a.send(date)
- 若收到空值,最后一步是断开连接。a.close()
客户端实现上述效果流程:
- 创建套接字,即实例化生成客户端套接字。client = socket.socket()
- 向服务端发送连接请求,连接成功后,原本的客户端套接字实际上就变成了对等连接套接字。代码中的ip和端口是服务端的ip和端口。client.connect(('127.0.0.5',8520))
- 向服务端发送信息。client.send(mess)
- 向服务端接收信息,这里会发生一次阻塞。client.recv(1024)
- 主动断开与服务端的连接,这时客户端会自动向服务端发送一个空值。client.close()
什么是阻塞?
最早我们见过的阻塞应该是input,但那时我们应该还没有这方面的认识,阻塞是指当代码运行的这里时,需要触发到某个条件,代码才能继续运行下去,否则会一直堵在这。而最早见的input,我们只要输入字符再按enter就可以继续运行了。在套接字中我们碰到两个阻塞,一个是accept,它的疏通条件是客户端发送连接请求,还有一个是recv,它的疏通条件是接收的对方发来的信息。
代码中各个对象解剖
实例化对象
绑定地址后
接受到连接请求后
客户端连接成功后
套接字阻塞带来的影响:因为阻塞导致服务端一次只能与一个客户端相连,这在实际应用中是万万不可行的,在下篇博客中,我会对非阻塞套接字做一个总结。
套接字详解(socket)的更多相关文章
- Tomcat原理系列之六:详解socket如何封装成request(上)
目录 参与者 总结 @(详解socket如何封装成request) 看源码虽然不能马上提升你的编码水平.但能让你更好的理解编程. 因为我们tomcat多是以NIO形式处理请求,所以本系列讲的都是NIO ...
- raw_socket(原始套接字)以及普通socket使用终极总结
一.传输层socket(四层socket,普通socket) 可参考本人以下博客: Windows Socket编程之UDP实现大文件的传输:http://blog.csdn.net/luchen ...
- 伯克利套接字(BSD Socket)
http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...
- ulimit 命令详解 socket查看linux最大文件打开数
ulimit 命令详解 Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限 ...
- IDEA Spark Streaming 操作(套接字流)-----make socket数据源
import java.io.PrintWriter import java.net.ServerSocket import scala.io.Source object DStream_makeSo ...
- http服务详解(1)
前言:要熟练掌握一个服务,首先需要非常了解这个服务的工作过程. 跨网络的主机间通讯 在建立通信连接的每一端,进程间的传输要有两个标志: IP地址和端口号,合称为套接字地址 socket address ...
- 【转载】Linux下套接字学习
感觉这个系列还不错,学习一下. 先看的是第三篇: http://blog.csdn.net/gatieme/article/details/46334337 < Linux下套接字详解(三)-- ...
- python 套接字Socket详解
socket简介 1. 什么是socket ? socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是: 它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多 ...
- iOS中 HTTP/Socket/TCP/IP通信协议详解
// OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. ...
随机推荐
- 吴裕雄--天生自然C++语言学习笔记:C++ 字符串
C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...
- Spring-ResolvableType可解决的数据类型
ResolvableType,可解决的数据类型.它为java语言中的所有类型提供了相同的数据结构,其内部封装了一个java.lang.reflect.Type类型的对象. 在讲解这个数据结构之前,首先 ...
- office(CVE-2012-0158)漏洞分析报告
2019/9/12 1.漏洞复现 ①发现崩溃 ②找到漏洞所在的函数,下断点,重新跑起来,单步调试,找到栈被改写的地方 ③分析该函数 把MSCOMCTL拖入IDA,查看该函数代码 ④查看调用栈,回溯. ...
- 中国移动携手华为百度展示5G应用,实现8K视频传输
在今日举行的 2019 年百度云智峰会上,中国移动携手华为和百度,首次展示基于 SA 架构的 5G Vertical LAN (行业局域网)技术,承载 8K 实时会议系统,助力企业云办公.该技术可为合 ...
- SqlServer 集合运算符
1.集合运算符概述 (1)集合运算符运用与集合之间的运算. (2)多元集合: 指的是来自两个输入查询的集合,可能包含重复项 (3)T-SQL 支持三种集合运算符 union .intersect .e ...
- JVM源码分析之自定义类加载器如何拉长YGC
概述 本文重点讲述毕玄大师在其公众号上发的一个GC问题一个jstack/jmap等不能用的case,对于毕大师那篇文章,题目上没有提到GC的那个问题,不过进入到文章里可以看到,既然文章提到了jstac ...
- rdlc报表带参数打印
1.新建rdlc文件报表 2.选中rdlc文件=>视图=>报表资料 添加几个参数,如图 设计报表页面 int WaitNum = this.queueDTOs.Where(m=>m. ...
- jQuery元素的左右移动
1.下载jQuery,并导入:https://blog.csdn.net/weixin_44718300/article/details/88746796 2.代码实现: <!DOCTYPE h ...
- maven项目中WEB-INF的父目录必须叫webapp吗?
这个并不是必须的,可以在pom配置文件中修改,如下所示: <webappDirectory>src/main/WebContent</webappDirectory> ...
- CF1217B Zmei Gorynich
You are fighting with Zmei Gorynich — a ferocious monster from Slavic myths, a huge dragon-like rept ...