网络编程
一、网络编程
二、端口
三、TCP协议
四、socekt(本地套接字)
五、业务流程
六、总结
一、网络编程
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>