【流式套接字的编程(基于tcp协议的】
1.TCP服务端:
import socket
1.创建套接字
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.绑定地址(IP端口号)
sockfd.bind()
功能:绑定地址
参数:一个二元元组(包含两项) 第一项为IP 第二项为端口号
('172.60.50.50',8888)
3.将套接字设置可监听
sockfd.listen(n)
功能:将套接字设置为监听套接字
参数:n是一个正整数 表示监听等待队列的大小
4.等代接收连接请求
connfd,addr = sockfd.accept()
功能:阻塞等待处理客户端连接
返回值:第一个:一个新的套接字,用来和客户端通信
第二个:连接的客户端的地址
* 阻塞函数:程序运行到阻塞函数的位置,如果某种期待条件没有达成则暂停继续运行
当条件达成后会结束阻塞继续运行。
5.收发消息
data = connfd.recv(buffersize)
功能:流式套接字接收消息
参数:一次最多接收多大的消息,字节
返回值:返回接收到的内容
n = connfd.send()
功能:流式套接字发送消息
参数:要发送的内容,要求bytes格式
返回值:返回实际发送的字节数
6.关闭套接字
close()
功能:关闭套接字 tcp套接字连接断开
2.tcp客户端
1.创建套接字
socket()
2.请求连接
connect()
功能:发起连接请求
参数:是一个元组,表示服务器的地址
3.消息收发
recv() send() # 客户端先发消息
4.关闭套接字
close
3.recv()/send()特性:
recv()特性
- 如果连接双方断开连接,则recv会立即结束阻塞返回空字符串
- 当接收缓冲区为空的时候会阻塞
- 如果recv一次接收不完缓存区内容,下一次会继续接收
send()特性:
4. 如果一端不存在,另一端还在试图send操作时会产生BrokenPipeError异常
5. 当发送缓冲区慢的时候会阻塞
4.具体代码:
tcp_server.py
from socket import *
# 创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
# 绑定地址
sockfd.bind(('127.0.0.1',8888))
# 设置监听
sockfd.listen(