Ŀ¼
数据从客户端---->服务端的协议
客户端请求连接服务端的过程需要经过三次握手
1.客户端首先会向服务端发出请求,这个请求中会带有一个SYN报头
2.服务端会接收到客户端的请求,然后响应客户端,并把SYN报头返回给客户端,而且返回的数据中会加一个ACK报头
3.客户端开始建立连接状态,并发送一条请求,这条请求带上返回的ACK报头,让服务端也进入连接状态
1.客户端首先发送带FIN报头的请求给服务端,请求断开连接
2.服务端接收到客户端的请求后,返回一个带ACK报头的确认请求,来表明同意断开
3.但由于可能会存在数据没有传输完全的情况,所以服务端还不会马上断开,它会等数据全部传输完毕之后,发送一条带上返回的FIN报头的请求给客户端
4.最后客户端收到请求后,返回带有ACK报头的数据给服务端,服务端接到数据之后,断开连接
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'))