一、网络编程
ip地址: 网络中标识唯一一台网络设备的编号
在同一个局域网中的网段是相同的
产看电脑的ip地址
mac/linux : ifconfig
win: ipconfig
ip地址:
ipv4 : 已经枯竭了
ipv6 : 够用的
ping 命令:
检测网络是否畅通
ping localhost 等价于 ping 127.0.0.1 检测本机网络环境是否畅通
二、端口
端口: 网络数据毕竟的地方
端口号: 对端口的编号
在网络中通过ip地址可以找到一个网络设备, 通过端口号可以找到这台网络设备中的一个网络程序
端口号的分类
知名端口
0~1023
动态端口
1024~65535
测试端口
8080
三、TCP协议
网络中通过tcp协议进行建立链接需要
建立链接
- 三次握手的机制(链接建立成功)
- 数据通讯
发送发送应答机制(发送一个数据后一定会接收到一个应答 这才是一个完整的数据通讯)
超时重传(发送一个数据以后, 在一定的时间内没有接受到回答, 重写发送一个数据)
错误校验,发送数据的时候,会在数据的开头标明数据的信息(数据长度10)
流量控制
四、socekt(本地套接字)
socekt: 进程间进行数据通讯的一个工具(在网络中的进程间进行通讯)
tcp服务端的业务流程:
socket() : 创建一个服务端的电话 负责接受客户端的请求
bind() : 绑定一个ip地址和端口号 方便客户进行请求
listen() : 把socket这个电话从可以打电话也可以接电话 变成一个只可以接电话的电话(被动套接字socket)
accept() : 等待接受链接的到来,阻塞处理(类似于input)
recv() : 接受客户的数据
send() : 发送数据给客户
close() : 关闭套接字
五、业务流程
整个业务两个部分
客户端
服务端
客户端和服务端进行数据的传输
建立连接
三次握手(打电话打通)
数据的交互
send(data)
recv(data)
连接断开
四次挥手
server 和 client进行断开过程
六、总结
# 导入socket模块 import socket # 1. 创建电话 # 参数1: ipv4地址 # 参数2: tcp协议, 流式协议 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定电话号码 # 参数: 元组 # 元组中的第一元素: 字符串类型的数据 ip地址 # 元组中的第二元素: 整数类型 端口号 tcp_socket.bind(("127.0.0.1", 8080)) # 3. 改成只能接电话 # 参数: 同一时刻最大可以接受的链接请求数量 tcp_socket.listen(128) while True: # 4. 等待客户的到来 # 阻塞等待客户的链接请求的到来 # client_socket ==> 和客户端通讯的电话 # client_addr ==> 客户端的ip地址和端口号 client_socket, client_addr = tcp_socket.accept() print(f"客户端{client_addr}上线了") # 让我们的小弟(client_socket) 可以一直跟一个客户进行数据的交互 while True: recv_data = client_socket.recv(1024) print("接受到的客户端数据:", recv_data.decode("gbk")) if len(recv_data) == 0: print(f'{client_addr}客户端断开连接') client_socket.close() break data = input("请输入数据:") client_socket.send(data.encode("utf8")) # 7.挂电话 tcp_socket.close()
解析:
01-创建电话-socket()
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
参数1: socket.AF_INET ==> ipv4地址
参数2: socket.SOCK_STREAM ==> tcp协议
02-绑定地址信息-bind()
tcp_socket.bind(("127.0.0.1", 8080))
参数(元组类型的):
元组的第一元素 : 字符串类型的数据 ip地址
元组中的第二元素: 整数类型 端口号
03-设置监听listen-让tcp_socket变成一个只会接受数据的socket
tcp_socket.listen(128)
04-设置了循环while True
accept() 让我们的大哥(tcp_socket) 可以一直循环接受 用户的连接请求
client_socket, client_addr = tcp_socket.accept() print(f"客户端{client_addr}上线了")
recv()~send() 让我们的小弟(client_socket) 可以一直跟一个客户进行数据的交互
while True: recv_data = client_socket.recv(1024) print("接受到的客户端数据:", recv_data.decode("gbk")) if len(recv_data) == 0: print(f'{client_addr}客户端断开连接') client_socket.close() break data = input("请输入数据:") client_socket.send(data.encode("utf8"))
如何判断客户端是否断开了链接:
如果接受的数据为空 即数据的长度为0 那么证明客户端断开了链接
<end>