socket套接字编程:
目标:根据socket模块提供的接口函数,进行组合使用完成基于TCP或者UDP的网路编程
套接字:完成上述目标的一种编程手段,编程方案
套接字分类:
流式套接字(SOCK_STREAM):传输层基于TCP协议的套接字编程方案。
数据报套接字(SOCK_DGRAM):传输层基于UDP协议的套接字编程方案。
底层套接字(SOCK_RAM):访问底层协议的套接字编程
面向连接的传输--TCP协议--可靠的--流式套接字
面向无连接传输--UDP协议--不可靠--数据报套接字
TCP套接字服务端编程
import socket
1.创建套接字
sockfd = socket.socket(socket_family = AF_INET, socket_type = SOCK_STREAM, proto = 0) #返回套接字对象
socket_family:选择地址族类型
AF_INET:使用IPV4进行网络通讯
socket_type:套接字类型
SOCK_STREAM:流式
SOCK_DGRAM:数据报
proto:选择子协议类型,通常为0
2.绑定服务端地址
sockfd.bind(addr) #绑定IP地址,无返回值
addr:元组,(ip, port)
localhost 可以被本机用 127.0.0.1
127.0.0.1 同上
192.168.205.127 可以被所有人用192.168.205.127访问
0.0.0.0 可以被别人用192.168.205.127访问,也可以自己用127.0.0.1访问
3.设置监听套接字(只有TCP才需要这一步)
sockfd.listen(n) #将套接字设置为监听套接字,创建监听队列
n:表示监听队列大小
一个监听套接字可以连接多个客户端套接字
4.等待处理客户端连接请求
connfd, addr = dockfd.accept() #阻塞等待处理客户端连接
返回值: connfd 客户端连接套接字
addr 连接的客户端地址
阻塞函数:程序运行过程中遇到阻塞函数则暂停运行,直到某种阻塞条件达到再继续运行,如:input,sleep等
5.消息收发
data = connfd.recv(buffersize) #接收对应客户端消息
buffersize:一次最多接收多少字节
返回值:接收到的内容的bytes格式
如果没有消息则会阻塞
n = connfd.send(data) #发送消息给对应客户端
data:要发送的内容,必须是bytes格式
返回值:返回实际发送消息的大小
6.关闭套接字
sockfd.close() #关闭套接字
TCP客户端编程
1.创建套接字
必须相同类型的套接字才能通信
2.建立连接
sockfd.connect(server_addr) #建立连接
server_addr:元组,服务端地址,如:
3.消息收发
消息收发要和服务端配合,避免两边都出现recv阻塞
4.关闭套接字
发表评论