套接字详解(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. ...
随机推荐
- Docker Java 例子
版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...
- kafka源码系列之mysql数据增量同步到kafka
一,架构介绍 生产中由于历史原因web后端,mysql集群,kafka集群(或者其它消息队列)会存在一下三种结构. 1,数据先入mysql集群,再入kafka 数据入mysql集群是不可更改的,如何再 ...
- Django template配置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join( ...
- input内容,输入账号密码
在爬取需要输入账号密码的网页时,我们需要找到可填写内容的标签.记得之前写过,但是没有记住. 这回重新梳理一下,如何可找到这个标签 以极验后台登录网站为例:https://auth.geetest.co ...
- UVA - 11093 Just Finish it up(环形跑道)(模拟)
题意:环形跑道上有n(n <= 100000)个加油站,编号为1~n.第i个加油站可以加油pi加仑.从加油站i开到下一站需要qi加仑汽油.你可以选择一个加油站作为起点,起始油箱为空(但可以立即加 ...
- POJ 2239:Selecting Courses 选课
Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9380 Accepted: 4177 ...
- java课程课后作业190530之用户体验评价
每个人评价一下大家手头正在使用输入法或者搜索类的软件产品. 从用户界面.记住用户选择.短期刺激.长期使用的好处坏处.不要让用户犯简单的错误四个方面发表一篇博客. 输入法:苹果自带的输入法 用户界面:简 ...
- HTML笔记及案例
- 了解什么是标记语言 - 了解HTML主要特性,主要变化以及发展趋势 - 了解HTML的结构标签 - 掌握HTML的主要标签(字体,图片,列表,链接,表单等标签) ### 1.网站信息页面 #### ...
- c# 异步和同步 多线程
在执行较为耗时的处理时,很容易出现用户界面“卡顿”现象,用异步编程模型,将耗时处理的代码放到另一个线程上执行,不会阻止用户界面线程的继续执行,应用程序 就不再出现“卡顿”现象. 本例子提供同步加载和异 ...
- STL库中的equal_range()
equal_range根据键值,返回一对迭代器的pair对象.如果该键值在容器中存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置.如果找不 ...