栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

socket套接字+python应用socket案例流程图+实现代码

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

socket套接字+python应用socket案例流程图+实现代码

socket套接字

把协议应用到我们程序上,发送一些数据,这个时候就需要socket

socket是对tcp/ip 协议的一个封装
socket不是协议
socket是一套调用的借口规范(API)
socket分为UDP编程,TCP编程,2种
应用层=(应用层+表示层+会话层) python中的网络编程

python网络编程的有2种网络服务,高级,低级

网络服务级别内容
低级支持基本的socket
标准的BSD Sockets API
可以访问底层操作系统Socket接口的全部方法
高级SocketServer模块
服务器中心类
简化网络服务器的开发
python中还有其他应用级网络协议:FTP,HTTP的更高级别访问库

Python Socket 模块库

Python Socket 模块库基础的网络通信
提供的属性和方法
1.创建Socket
2.地址绑定
3.TCP 或 UDP 协议的实现
4.接收,发送数据
5.关闭连接
创建过程TCPUDP
1.创建Socket对象创建套接字
socket.socket([family[,type[,proto]]])
-family:套接字家族可以使用
AF_UNIX 【 unix 系统之间进程通信】或
AF_INET 【tcp/ip 协议族使用这个参数表示IPv4】
AF_INET6【tcp/ip 协议族使用这个参数表示IPv6】

-type:套接字类型可以根据是面向连接还是非连接分为
SOCK_STREAM 【tcp面向字节流-使用】
SOCK_DGRAM 【udp数据报-使用】

创建实例:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.1服务端地址绑定绑定主机地址和端口号
绑地址和端口号
-s.bind((host,port))
绑定主机地址和端口号
绑地址和端口号
-s.bind((host,port))
2.2服务器端监听数量开始TCP监听(转化为被动连接)
监听数量,不可为0
-s.listen(n)
无连接
2.3服务器端等待连接接受客户端连接,持续等待连接
-s.accept()
返回值有2个,需要用变量来装载
刚刚接受的客户端套接字,这个客户端的地址=s.accept()
当接收了一个之后,也就是调用完之后,
那么之间创建的socket就再去等待其他的客户端连接
无连接
3.客户端连接服务器客户端主动初始化TCP服务连接
地址+端口:address=(host,port)
s.connect(address)
无连接
4.1客户端接收数据
-s.recv(bufferfsize[,flags])
从套接字接收TCP数据,返回字节对象,
buffersize制定一次接收的最大数据量
buffer size也叫缓冲尺寸

-s.recvfrom(bufsize[.flags])
接受UDP数据,与recv()类似.
返回值为字节对象和地址(bytes,address)
4.2
客户端/服务端
通用发送一次数据
-s.send(bytes[,]flags)
发送数据给套接字
发送的是字节数据,
如本地的是utf8格式的数据需要转换为字节才可以发送
没有这个
4.3
客户端/服务端
通用发送数据
没有这个-s.sendto(bytes,address)
发送UDP数据到套接字
address形式为(ipaddr,port)的元组
返回值是发送的字节数
4.4
客户端/服务端
通用发送数据
-s.sendall(bytes[,flags])
持续从bytes发送数据
直到所有数据发送完毕或发生错误为止
(成功返回None,失败抛出异常)
没有这个
4.5
客户端/服务端
发送文件
-s.sendfile(file,offset=0,count=None)
5.关闭连接s.close()
四次挥手
s.close()
直接关闭
通用方法
1.获取socket地址s.getpeername()
返回套接字的远程地址
返回值的形式一般是元组(ipaddr.port)

s.getsockename()
返回套接字自己的地址
2.设置连接超市时间s.settimeout(timeout)
设置套接字操作的超市时间,单位是s,秒,浮点数值
3.获取主机名
获取主机名
-host=socket.gethostname()
4.缓冲区大小服务端接收数据的缓冲区。
当如果buffersize设置的比较小,那么获取到客户端发送过来的一部分数据。
想获取客户端发送过来的所有数据,则需要循环不断的调用recv()方法。
怎么判断后面还有其他未读的数据.
根据当前读取的字节数是否小于缓冲区的尺寸来判断是否后面还有其他未读的数据,如果没有,则终止循环

UDP通信流程

服务器端创建socket绑定地址/端口发送/接收数据关闭
客户端创建socket----发送/接收数据关闭

TCP通信流程

服务器端创建socket绑定地址/端口转化为被动连接接收客户端连接接收/发送数据关闭
客户端创建socket––连接服务器发送/接收数据关闭

客户端与服务端的绑定端口

客户端服务端
从下面的图里面只有服务端socket需要绑定端口号,其实客户端socket在和服务端Socket连接时也需要一个端口号
客户端socket的端口号一般是自动产生和绑定的,这个端口由socket的对象accept()方法返回。每一个客户端socket的端口一般都是不同的
必须绑定
字节流<转换>utf-8
编码encode
把看的懂的编辑成机器传输的字节
格式为:变量=“python默认的utf-8字符格式”
变量.encode(“utf-8”)
编码成byte
把utf-8的字符串编辑成看不懂的字节-----用来给socket传输
得到"pythonxe9xbbx98xe8xaexa4xe7x9ax84utf-8xe5xadx97xe7xacxa6xe6xa0xbcxe5xbcx8f“
解码decode
把机器传输的字节解码成人能看懂的
格式为:变量=byte
变量=‘pythonxe9xbbx98xe8xaexa4xe7x9ax84utf-8xe5xadx97xe7xacxa6xe6xa0xbcxe5xbcx8f’
把byte解码成能看懂的UTF-8字符
变量.decode(‘utf-8’)
第二种写法:变量.decode(encoding=“utf-8”)
得到"python默认的utf-8字符格式"

UDP通信图


TCP通信图

实例图,UDP通信

服务器端:udp1通信服务端接收信息.py
客户端:udp2通信客户端发送信息.py

先执行,udp1通信服务端接收信息.py

# 服务端--接收端---仅仅能接收1条信息就关闭,因为没有设置循环监听,所以第2条信息没收到。
# 1导入socket库 的所有API
from socket import *
#2创建socket的实例,使用tcp/ip中的连接,使用udp的连接
udp_socket=socket(AF_INET,SOCK_DGRAM)
# 3绑定地址相关信息,本机,端口
udp_socket.bind(('127.0.0.1',8888))
# 4.1等待接收/发送数据
# 4.2设置接受的最大字节数1024
recv_data,addr=udp_socket.recvfrom(1024)
#打印接收的信息,因为用的是python语言,默认是utf-8的字符码格式
print('收到ip为:%s,端口为:%s,发送过来的信息--%s--' % (addr[0],addr[1],recv_data.decode('utf-8')))
# 5关闭连接,接收后就关闭等待接受,没有循环等待接受
udp_socket.close()

后执行,udp2通信客户端发送信息.py

# 客户端--发送端,发送2条信息才关闭,
# 1导入socket库
from socket import *
#2创建socket的实例,使用tcp/ip中的连接,使用udp的连接
udp_socket=socket(AF_INET,SOCK_DGRAM)

# 3绑定地址相关信息,本机,端口
# 3无---因为是客户端,不用绑定

# 4.1等待接收/发送数据
# 4.2 创建变量来装载 服务端的ip号和端口号
address=('127.0.0.1',8888)
# 4.3发送一条信息
udp_socket.sendto("第1条信息".encode('utf-8'),address)
# 4.4发送一条信息
udp_socket.sendto("第2条信息".encode('utf-8'),address)
# 5关闭连接,发送后就关闭,没有其他任务了
udp_socket.close()

实例图,TCP通信
服务器端:tcp1服务端.py
客户端:tcp2客户端.py

tcp1服务端.py

# 服务器端--创建实例--绑定地址+端口---监听----接收信息----然后解码打印--
from socket import *


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



# 绑定本地信息
address=('127.0.0.1',8888)#本个脚本是服务器端,所以需要绑定ip与端口号
tcp_server_socket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,
# 使用listen将其改为被动,这样可以接受别人的连接了
# 设置最大可连接数量=999
tcp_server_socket.listen(999)



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

# 接收数据设置
# 接受对方送过来的数据,设置最大接收字节个数=1024
recv_data=client_socket.recv(1024)
print('接收到的数据为:',end="")
print(recv_data.decode('gbk'))





# 发送一些数据到客户端
client_socket.send("问候文字,别发过来了!".encode('gbk'))



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

tcp2客户端.py

# 客户端---创建实例--链接服务端--输入文字--发送数据(信息)---接收数据(信息)--不关闭
from socket import *


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



# 向什么服务器连接,ip号-端口号
server_ip='127.0.0.1'
server_port=8888
# 连接服务器---connect里面必须是元组
tcp_client_socket.connect((server_ip,server_port))





# 提示用户输入数据
send_data=input('请输入要发送给的数据:')
tcp_client_socket.send(send_data.encode('gbk'))


# 接收数据设置
# 接受对方送过来的数据,设置最大接收字节个数=1024
recv_data=tcp_client_socket.recv(1024)
print('接收到的数据为:',end='')
print(recv_data.decode('gbk'))









# 关闭套接字
tcp_client_socket.close()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/924072.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号