TCP实现socket通信(python)

2023-11-11

  1.  socket简介
  2. UDP实现socket通信(python)
  3. TCP实现socket通信(python)

1、套接字工作流程

  1. 服务器端先初始化Socket,建立一个套接字
  2. 与端口绑定(bind),用 bind 函数来绑定一个端口号和 IP 地址。
  3. 对端口进行监听(listen),服务器调用 listen 函数,使服务器的这个端口和 IP 处于监听状态
  4. 服务器调用accept阻塞,等待客户端连接。等待客户机的连接。
  5. 客户机用 socket 函数建立一个套接字,设定远程 IP 和端口。
  6. 客户机调用 connect 函数连接远程计算机指定的端口。
  7. 服务器用 accept 函数来接受远程计算机的连接,建立起与客户机之间的通信。
  8. 建立连接以后,客户机用 write 函数向 socket 中写入数据。也可以用 read 函数读取服务器发送来的数据。
  9. 服务器用 read 函数读取客户机发送来的数据,也可以用 write 函数来发送数据。
  10. 完成通信以后,用 close 函数关闭 socket 连接。

2、TCP客户端-发送数据

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))

# 链接服务器
tcp_client_socket.connect((server_ip, server_port))

# 提示用户输入数据
send_data = input("请输入要发送的数据:")

tcp_client_socket.send(send_data.encode("gbk"))

# 关闭套接字
tcp_client_socket.close()

3、TCP服务端-接收数据 

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
tcp_server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,1) # 在链接异常终止后,再次启动会复用之前的IP端口,防止资源没有释放而产生地址冲突

# 本地信息
address = ('', 7788)

# 绑定
tcp_server_socket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()

防止启动的时候地址端口被占用,未被释放,可在bind前添加test.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

tcp_server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,1) # 在链接异常终止后,再次启动会复用之前的IP端口,防止资源没有释放而产生地址冲突

提示:当客户端发送空字符串时,服务端是不会收取的,这样就会倒是通讯终止在当前,可以通过控制客户端发送的内容来防止出现此问题。

tcp注意点

  1. tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
  2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
  4. 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
  5. 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
  6. listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线。

TCP特点

1. 面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这一个连接进行。

完成数据交换后,双方必须断开此连接,以释放系统资源。

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

2. 可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

4) 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

————————————————————————————————————
参考:

  1. https://www.jianshu.com/p/f75bc9971169 作者:断尾壁虎V
  2. https://blog.csdn.net/qq_26399665/article/details/52932755
  3. https://www.cnblogs.com/daijingkun/p/10871976.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP实现socket通信(python) 的相关文章

随机推荐

  • Tomcat shutdown port 8005这个端口可以关掉吗?

    官网解释 The TCP IP port number on which this server waits for a shutdown command Set to 1 to disable the shutdown port Note
  • 野火-Stm32

  • 使用navicat连接oracle时,解决报错listener does not currently know of service

    原因 监听程序当前无法识别连接描述符中请求的服务 解决方案 1 在Oracle下载目录下搜索tnsnames ora 我的是在 W Tools Oracle setup app oracle product 11 2 0 server ne
  • 9.2 向量范数的三大不等式

    文章目录 柯西 施瓦茨不等式 赫尔德不等式 闵可夫斯基不等式 我这里要讲的三大不等式不是三种范数比较大小的三大不等式 而是非常经典的 学习线性代数必须掌握的三大不等式 柯西 施瓦茨不等式 赫尔德不等式和闵可夫斯基不等式 我先讲讲这三大不等式
  • 第三方jar包引入项目,发布到本地和远程仓库

    在开发过程中 往往会遇到对接其他公司的系统 然后对接公司会提供API对接方式 就是给一个jar包 我们只需要把jar包引入到项目中直接用即可 本地引用jar的话可以有两种方式 第一种就是本地包引用 如下将包放下工程下 然后maven指定 但
  • 关于Pytorch中的向量拼接

    torch cat A torch ones 2 4 print A B 2 torch ones 2 4 print B C torch cat A B 0 print C D torch cat A B 1 print D A的输出 t
  • 改变linux命令行中的颜色

    黑色背景 白色字体虽然是最经典的 但是有时候太多白花花的英文在一起也会变得乱 下面是我的改变字体的办法 目前我只实现了让root目录下的字体变为绿色 如下图 这个只是最简单的改变颜色的 虽然对大牛们来说很简单 但对我这个初学者来说 真是费了
  • 144项ppt制作技术

    1 两幅图片同时动作 PowerPoint的动画效果比较多 但图片只能一幅一幅地动作 如果你有两幅图片要一左一右或一上一下地向中间同时动作 可就麻烦了 其实办法还是有的 先安置好两幅图片的位置 选中它们 将之组合起来 成为 一张图片 接下来
  • 用Python建立可进可退的多级菜单系统

    coding utf 8 功能 可进可退的多级菜单系统 作者 XxLyle 日期 2021 12 16 def add record print 添加记录功能模块尚待开发 def find record print 查询记录功能模块尚待开发
  • Photoshop cs6 如何让图层渐变透明

    点击图层面板下方的蒙板工具 再选择左侧工具栏的渐变填充 选择黑 白渐变色 在图层上拖动 1 点击面板下方蒙板工具 在需要处理的图层上添加蒙板 2 选择渐变工具 快捷键G 选择黑白渐变 然后按住shift拖动鼠标拉个渐变就出来了 3 另外可以
  • 小程序的父子之间的传值调用

    前言 我们在小程序中父子组件之间的传值方法 目录 父传子 properties 步骤 1 在父组件 index wxml里面给调用子组件的地方绑定一个字段map 2 在父组件 index js中定义字段map 并用this setData改
  • Hbase批量查询-scan介绍

    1 scan原理 HBase的查询实现只提供两种方式 1 按指定RowKey 获取唯一一条记录 get方法 org apache hadoop hbase client Get Get 的方法处理分两种 设置了ClosestRowBefor
  • 桌面软件自动化测试小记

    什么是软件自动化测试 如何学习软件自动化及几个例子 Py UiAutomation
  • Swagger的使用详细教程

    Swagger的使用详细教程 Swagger是一款开源的API文档工具 它提供了一种简单且强大的方式来描述 展示和测试RESTful风格的Web服务接口 本文将详细介绍Swagger的使用方法 包括安装配置和使用示例 步骤 1 添加Swag
  • 基于Python的机器学习实践(portein)

    目录 数据集 简介 代码 1 数据的读入 2 数据理解 3 数据规整化处理 数据准备 4 数据建模 5 查看模型 6 模型预测 7 结果输出 数据集 https download csdn net download llf000000 86
  • JMeter使用命令行模式生成HTML测试报告

    自动生成html图形化报告 win r 输入 cmd 说明 jmeter n t Jmx脚本位置 l 结果文件result jtl存放的位置 e o 生成HTML报告指定文件夹 n 表示non gui mode 就是非图形化模式 t 指定J
  • 怎么更改dns_ESHOP连不上?SWITCH最新实用DNS地址分享

    虽然任天堂Switch采用的是不锁区的方式 但是由于各种虚拟墙的存在已经网络延迟等问题 经常导致玩家连不上eshop 买不了游戏 更新个游戏显示都要好几万小时 当然这个可以使用各种加速器等方式来解决 但是好的加速器需要付费 免费的又会经常抽
  • Receive port always be disabled.

    I configured a receive port in FILE to a local folder Biztalk administration console keep show that port is disables I f
  • 支付宝个人收款解决方案之支付宝签约方案

    关键词 签约支付 签约收款 支付宝收款 个人签约收款 背景 有做网赚或者在网上售卖个人小产品小服务的 需要进行收款 如果零星个别的收款可能直接走个人转账然后手动发货即可 但是一旦流程标准下来 量走起来之后 付款发货就需要自动化了 以提高人效
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址