用户认为的信息之间传输只是建立以两个应用程序上,实际上在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!

代码详解

服务端实现上述效果流程:

  1. 创建套接字,即实例化。server = socket.socket()
  2. 绑定地址,且地址是一个元组,里面包括ip和端口,为自己创建了一个地址,用于客户端的连接。server.bind(('127.0.0.5',8520))
  3. 开始监听,此时的套接字server才被真正叫做监听套接字,自此之前,客户端是无法连接过来的。代码中的5表示最大能同时连接到客户端的数量。server.listen(5)
  4. 收到连接请求就建立与客户端连接,返回结果由两个变量接收,第一个变量是对等连接套接字,第二个是客户端的地址(ip和端口)a,b = server.accept(),这里要特别注意是会有阻塞现象,阻塞在下面介绍。
  5. 利用对等连接套接字开启接收信息状态。若接到空值,表示客户端已主动断开连接。这里也会产生一次阻塞,客户端是无法发送空值的。代码的1024表示可以接收的最大字节数。a.recv(1024)
  6. 信息传递讲究一收一发,一发一收。若收到信息,应给客户端一个回复。这里要注意的是信息的传递是以字节的形式。a.send(date)
  7. 若收到空值,最后一步是断开连接。a.close()

客户端实现上述效果流程:

  1. 创建套接字,即实例化生成客户端套接字。client = socket.socket()
  2. 向服务端发送连接请求,连接成功后,原本的客户端套接字实际上就变成了对等连接套接字。代码中的ip和端口是服务端的ip和端口。client.connect(('127.0.0.5',8520))
  3. 向服务端发送信息。client.send(mess)
  4. 向服务端接收信息,这里会发生一次阻塞。client.recv(1024)
  5. 主动断开与服务端的连接,这时客户端会自动向服务端发送一个空值。client.close()

什么是阻塞?

最早我们见过的阻塞应该是input,但那时我们应该还没有这方面的认识,阻塞是指当代码运行的这里时,需要触发到某个条件,代码才能继续运行下去,否则会一直堵在这。而最早见的input,我们只要输入字符再按enter就可以继续运行了。在套接字中我们碰到两个阻塞,一个是accept,它的疏通条件是客户端发送连接请求,还有一个是recv,它的疏通条件是接收的对方发来的信息。

代码中各个对象解剖

实例化对象

绑定地址后

接受到连接请求后

客户端连接成功后

套接字阻塞带来的影响:因为阻塞导致服务端一次只能与一个客户端相连,这在实际应用中是万万不可行的,在下篇博客中,我会对非阻塞套接字做一个总结。

套接字详解(socket)的更多相关文章

  1. Tomcat原理系列之六:详解socket如何封装成request(上)

    目录 参与者 总结 @(详解socket如何封装成request) 看源码虽然不能马上提升你的编码水平.但能让你更好的理解编程. 因为我们tomcat多是以NIO形式处理请求,所以本系列讲的都是NIO ...

  2. raw_socket(原始套接字)以及普通socket使用终极总结

      一.传输层socket(四层socket,普通socket) 可参考本人以下博客: Windows Socket编程之UDP实现大文件的传输:http://blog.csdn.net/luchen ...

  3. 伯克利套接字(BSD Socket)

    http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...

  4. ulimit 命令详解 socket查看linux最大文件打开数

    ulimit 命令详解     Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限 ...

  5. IDEA Spark Streaming 操作(套接字流)-----make socket数据源

    import java.io.PrintWriter import java.net.ServerSocket import scala.io.Source object DStream_makeSo ...

  6. http服务详解(1)

    前言:要熟练掌握一个服务,首先需要非常了解这个服务的工作过程. 跨网络的主机间通讯 在建立通信连接的每一端,进程间的传输要有两个标志: IP地址和端口号,合称为套接字地址 socket address ...

  7. 【转载】Linux下套接字学习

    感觉这个系列还不错,学习一下. 先看的是第三篇: http://blog.csdn.net/gatieme/article/details/46334337 < Linux下套接字详解(三)-- ...

  8. python 套接字Socket详解

    socket简介 1. 什么是socket ? socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是: 它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多 ...

  9. iOS中 HTTP/Socket/TCP/IP通信协议详解

    // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. ...

随机推荐

  1. 【LGR-(-8)】洛谷入门赛 #5 题解

    比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...

  2. Elasticsearch 使用集群

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  3. HDU - 4405 Aeroplane chess(期望dp)

    题意:沿着x轴从0走到大于等于N的某处,每一步的步数由骰子(1,2,3,4,5,6)决定,若恰好走到x轴上某飞行路线的起点,则不计入扔骰子数.问从0走到大于等于N的某处的期望的扔骰子次数. 分析: 1 ...

  4. UVA - 1001 Say Cheese(奶酪里的老鼠)(flod)

    题意:无限大的奶酪里有n(0<=n<=100)个球形的洞.你的任务是帮助小老鼠A用最短的时间到达小老鼠O所在位置.奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动.洞和洞可以相交. ...

  5. UVA - 12627 Erratic Expansion(奇怪的气球膨胀)(递归)

    题意:问k小时后,第A~B行一共有多少个红气球. 分析:观察图可发现,k小时后,图中最下面cur行的红气球个数满足下式: (1)当cur <= POW[k - 1]时, dfs(k, cur) ...

  6. 每天一点点之vue框架开发 - vue坑-input 的checked渲染问题

    选中radio或者checkbox需要注意的是: 不管<input type='radio checked='true''>  你的checked属性值是true或者false,他都会选中 ...

  7. cf 621E. Wet Shark and Blocks

    神奇,矩阵乘法23333333333333333 递推式是很简单的(连我这种不会DP的人都写出来了.) 需要求出的是转移矩阵(还是叫系数矩阵的),也是最这个东西用快速幂. 这个东西的i,j大概就表示从 ...

  8. Vulkan SDK 之 Device

     Enumerate Physical Devices Vulkan instance创建完成之后,vulkan loader是知道你有几个物理设备(显卡),但是程序不知道,需要通过 相关接口获取设备 ...

  9. JAVAEE 和项目开发(第四课:HTTP的响应格式和响应状态码)

    HTTP 协议之响应 响应格式的结构: 响应行(状态行):HTTP 版本.状态码.状态消息 响应头:消息报头,客户端使用的附加信息 空行:响应头和响应实体之间的,必须的. 响应实体:正文,服务器返回给 ...

  10. 在开发过程中遇到的Oracle的坑及开发技巧

    本人与2018年毕业,工作一年多,仍是菜鸟,自毕业以来一直从事java软件开发工作,工作中大部分数据库都是使用的Oracle,碰到的问题总结一下(随时更新). 1.sql中使用group by 分组时 ...