套接字详解(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. ...
随机推荐
- Linux Mysql 安装 开启远程连接 供python agent 连接测试 Mark
Linux 6.3 (1) cat /etc/redhat-release uname -a 查看yum 源: 阿里源 无源运行: echo 下载阿里云的yum源配置 wget -O / ...
- SpringMVC: JSON
SpringMVC:JSON讲解 什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编 ...
- [CISCN2019 华北赛区 Day1 Web5]CyberPunk
0x00 知识点 PHP伪协议直接读取源码 http://xxx.xxx/index.php?file=php://filter/convert.base64-encode/resource=inde ...
- HDU - 4430 Yukari's Birthday(二分+枚举)
题意:已知有n个蜡烛,过生日在蛋糕上摆蜡烛,将蜡烛围成同心圆,每圈个数为ki,蛋糕中心最多可摆一个蜡烛,求圈数r和看,条件为r*k尽可能小的情况下,r尽可能小. 分析:n最大为1012,k最少为2,假 ...
- jvm 优化
1.jvm 运行参数 1.1 jvm 参数类型 1.1.1 标准参数 -help -version 1.1.2 -X参数(非标准参数) -Xint -Xcomp 1.1.3-XX参数(使用率高) -X ...
- 了解OOM
1)什么是OOM? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError.看下关于的官方说明: Thrown when ...
- jquery散记
感觉jquery的用法都要忘没了,简单捡一下 1.window.onload与$(document).ready的区别 ()编写个数 window.onload = function(){} //不能 ...
- 开发app
开始学习apicloud开发流程 第一天 了解平台应用 第二天看视频进行学习软件开发的过程 第三天学习编码html 第四天编写了一副框架 第五天完成扫一i扫
- SpringCloud学习之Ribbon使用(四)
1.关于 Ribbon Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具.Ribbon 是 Netflix 发布的开源项目,主要功能是提供客 ...
- 7. react 基础 - React Developer Tools 的安装 及 使用
1. 安装 react 开发调试工具 React Developer Tools 打开 chrome 浏览器访问 chrome://extensions/ 点击右上角的 拓展程序 -> 打开 c ...