一、TCP协议
数据从客户端---->服务端的协议
二、三次握手
客户端请求连接服务端的过程需要经过三次握手
1.客户端首先会向服务端发出请求,这个请求中会带有一个SYN报头
2.服务端会接收到客户端的请求,然后响应客户端,并把SYN报头返回给客户端,而且返回的数据中会加一个ACK报头
3.客户端开始建立连接状态,并发送一条请求,这条请求带上返回的ACK报头,让服务端也进入连接状态
三、四次挥手
1.客户端首先发送带FIN报头的请求给服务端,请求断开连接
2.服务端接收到客户端的请求后,返回一个带ACK报头的确认请求,来表明同意断开
3.但由于可能会存在数据没有传输完全的情况,所以服务端还不会马上断开,它会等数据全部传输完毕之后,发送一条带上返回的FIN报头的请求给客户端
4.最后客户端收到请求后,返回带有ACK报头的数据给服务端,服务端接到数据之后,断开连接
四、socket套接字编程
1
# 自定义服务端
import socket
# 1.定义一个符合TCP协议的服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP协议
# 2.绑定IP地址
server.bind(('127.0.0.1', 8000)) # 127.0.0.1 代表本地 # 8000 端口
# server.bind(('192.168.11.196', 8000)) # 填自己的IP地址也可以用于和别的电脑连接
# 3.监听
server.listen(5) # 半连接池,参数表示可以连接的电脑数量
# 4.等待客户连接...
print('wait...')
# 5.连接循环(可以用于服务端与多个客户端相连)
while True:
# 6. conn 指的是连接的客户端 # client_addr 客户端的IP地址
conn, client_addr = server.accept()
# 7.通信循环(可以和一个客户端交互)
while True:
# 8.捕捉异常
try:
# 9.接收信息 receive
info = conn.recv(1024) # 限制接收数据的规模
# 10.打印信息
print(info.decode('utf-8'))
# 11.回复信息
msg = input('msg>>>')
conn.send(msg) # 向客户端发送消息,用客户端点出来的发送方法
except ConnectionAbortedError:
continue
except ConnectionResetError:
break
# 自定义客户端
import socket
# 1.创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.拨号(连接服务端)
client.connect(('127.0.0.1', 8000)) # 必须和服务端一致
# 3.通信循环(与服务端交互)
while True:
# 4.发送消息
info = input('info>>>')
client.send(info.encode('utf-8'))
# 5.接收消息
msg = client.recv(1024) # 接收时都会规定规模限制
print(msg.decode('utf-8'))
2.ssh
# 服务端
import socket
# 用于执行cmd命令,并把结果保存到管道中
import subprocess
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.11.196', 8000))
server.listen(5)
print('wait...')
while True:
conn, client_addr = server.accept()
while True:
try:
cmd = conn.recv(1024) # 接收客户端发来的cmd命令
# 帮你执行cmd命令,然后把执行结果保存到管道里
pipeline = subprocess.Popen(cmd.decode('utf-8'), # 将命令解码
shell = True, # 控制脚本命令
stderr = subprocess.PIPE, # 保存出错的信息
stdout = subprocess.PIPE) # 保存正确的信息
# 这里的管道涉及到数据结构中的队列,先进的先出,后进的后出
# 所以我们如果输入命令是正确的,就一定要先读取正确的信息,也即是把stdout放在stderr前面
# 读取错误信息
stderr = pipeline.stderr.read()
# 读取正确信息
stdout = pipeline.stdout.read()
# 发送执行结果给客户端
conn.send(stderr)
conn.send(stdout)
# 捕捉异常并终止内层循环
except ConnectionResetError:
break
# 客户端
import socket
# 1.创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.客户端连接服务端
client.connect(('192.168.11.196', 8000))
while True:
# 客户端发送cmd命令
cmd = input('>>>')
client.send(cmd.encode('utf-8'))
# 客户端接收数据并打印
data = client.recv(1024)
print(data.decode('gbk'))