socket套接字+python应用socket流程图基础
【摘要】 socket套接字把协议应用到我们程序上,发送一些数据,这个时候就需要socketsocket是对tcp/ip 协议的一个封装socket不是协议socket是一套调用的借口规范(API)socket分为UDP编程,TCP编程,2种传输层应用层+表示层+会话层socket调用TCPsocket调用UDPTCPUDP应用层程序IP协议`网络链路层 应用层=(应用层+表示层+会话层) pyth...
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.关闭连接 |
创建过程 | TCP | UDP |
---|---|---|
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传输 得到"python\xe9\xbb\x98\xe8\xae\xa4\xe7\x9a\x84utf-8\xe5\xad\x97\xe7\xac\xa6\xe6\xa0\xbc\xe5\xbc\x8f“ |
---|---|
解码 | decode 把机器传输的字节解码成人能看懂的 格式为:变量=byte 变量='python\xe9\xbb\x98\xe8\xae\xa4\xe7\x9a\x84utf-8\xe5\xad\x97\xe7\xac\xa6\xe6\xa0\xbc\xe5\xbc\x8f’ 把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
# 服务器端--创建实例--绑定地址+端口---监听----接收信息----然后解码打印--
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()
# 客户端---创建实例--链接服务端--输入文字--发送数据(信息)---接收数据(信息)--不关闭
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()
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)