基于tcp协议的套接字通信

1、套接字socket简介

Socket是应用层与TCP/UDP协议通信的中间软件抽象层,它充当一种接口的角色!封装了传输层以下的东西。

1.1基于tcp的socket通信流程图

image

2.tcp服务端搭建

需求:模拟两个手机的通话

from ipaddress import IPv4Address
import socket

# 1.买手机
# socket.AF_INET 指定使用的IPv4地址
# socket.SOCK_STREAM 指定是tcp协议,流式协议,这里发过来的数据像水流粘在一起,所以会带来粘包问题
# socket.SOCK_DGRAM 指定的是udp协议,每一份数据都有分隔,所以不会带来粘包问题
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2.绑定手机卡
 # 内部是参数是一个元组,第一参数为服务端自己对应的ip地址,第二个参数为需要绑定的端口
phone.bind(('127.0.0.1',8080))

# 3.开机--开启监听(把套接字由主动设置为被动模式)
phone.listen(5) # 5指的是半连接池的大小,最大允许128个连接

# 4.等待电话连接请求
while True:  # 加上链接循环
conn ,client_addr = phone.accept() 
# 返回的是一个元组,分别为,可以通过元组解包的形式得到具体的值
# conn 新的套接字,指的是服务当前的客户端套接字
# client_addr 客户端端口和ip地址


# 5.收/发信息
while True:
	data = conn.recv(1024)  # 最大接收的数据量为1024Bytes,收到的也是Bytes类型
	conn.send(data.upper())

# 6.关闭电话连接conn
conn.close()

3.tcp客户端搭建

import socket

# 1.买电话(与服务端建立连接)
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2.拨通服务端电话
# conneect里面是一个元组,第一个参数是服务端绑定的ip,第二参数是服务端绑定的端口
phone.connect(('127.0.0.1',8080))

# 3.发送信息
while True:
	msg = input()
	if msg == 'quit':
		break
	phone.send(“msg”.encode('utf-8'))
	phone.send('hello world'.encode('utf-8'))

# 4.接收消息
# recv_data 是接收到的数据的二进制,需要decode('utf-8')解码获取到数据
recv_data =phone.recv(1024)

# 5.关闭连接
phone.close()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于tcp协议的套接字通信 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 文章添加页(富文本编辑器的使用)

    1.文章添加页url开设 2.添加文章页面已经富文本编辑器的使用 富文本编辑器kindeditor只要到官网下载下来,放入static文件夹就行,如何在html的script处添加对应固定代码 {% extends ‘backend/base.html’ %} {% block article %} <h3>添加随笔</h3> &lt…

    2023年4月2日
    00
  • python中的三大主流wed框架简介

    1.django 特点:大而全,自带的功能特别特别多,类似于航空母舰 不足之处:有时候过于笨重 django中web框架的三个部分: socket部分:用的wsgiref模块路由与视图函数的对应关系:自己写的模板语法:自己写的 2.flask 特点:小而精,自带的功能特别少,类似于轻骑兵 但是它的第三方模块特别特别的多,如果把第三方模块加起来完全可以盖过dj…

    Python开发 2023年4月2日
    00
  • 基础数据类型之数字和字符串

    1.数字类型 数字类型的数据可以相互的进行+-/*、也可以进行相互的比较(<>=) 1.1整型int age = 18 记录年龄等整数 print(type(age))# int类型 int()方法可以将其他类型的数据转换成int类型 1.1.2二、八、十六进制的相互转换 1.十进制《—》二进制 # bin()方法 print(bin(11)…

    Python开发 2023年4月2日
    00
  • 线程

    1. 什么是线程 线程就是进程里面的执行单位,每一个进程肯定都自带一个线程,真正被cpu执行的是线程,线程是代码的执行过程,该过程中需要的资源都找对应的进程要 进程是资源的单位,线程是执行单位! 补充:同一个进程里面的多个线程资源是共享的! 2. 为啥要有线程 一个进程里面可以开设多个线程,而开设线程是不需要申请内存空间的(进程需要),因此,开设线程的消耗远…

    2023年4月2日
    00
  • 个人站点页面搭建和侧边栏展示功能

    展示个人站点页面 前端代码:和首页文章展示基本一样: <div class=”col-md-8″> {% for article in article_list %} <ul class=”media-list”> <li class=”media”> <a href=””><h4 class=”medi…

    Python开发 2023年4月2日
    00
  • 关于编辑器和解释型编译型语言

    各种语言用到的编辑器 python开发:pycharm(收费),vscode(免费),sublintext, go开发:goland(收费),vscode,国产的 java:idea(收费),eclipse(免费),MyEclipse(收费) android:androidstudio(免费),eclipse+adt 前端:webstorm(收费) php:…

    Python开发 2023年4月2日
    00
  • 自动生成路由和action的使用

    自动生成路由 普通cbv视图形式的路由: path(‘books4/’, views.Book4View.as_view()), re_path(‘books4/(?P<pk>\d+)’, views.Book4DetailView.as_view()) 继承了ViewSetMixin及其子类的视图路由: path(‘books5/’, view…

    Python开发 2023年4月2日
    00
  • 基础数据类型之集合

    1.集合的定义 在{}内用逗号分开多个元素,多个元素满足以下三个条件: 1.集合元素必须是不可变类型2.集合元素无序3.集合内元素没有重复(打印出来会自动去重) d = {} 默认是定义空字典 需要定义空集合,需要使用s = set() 2,集合的作用 (1)关系运算 # 如何取出这两个人共同的朋友呢? friend1=[‘zhang’,’yang’,’li…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部