day26作业 TCP三次握手,四次挥手 练习
三次握手
建立双向通道。建立好连接
TCP三次握手过程中使用了TCP标志 SYN 和 ACK
- 第一次握手,建立连接过程中,客户端发送SYN包(SYN=n)到服务端,并进入SYN_SEND状态,等待服务器确认。
- 第二次握手,服务器收到SYN包,必须确认客户端的SYN(ack=n+1),同时也要自己发送一条消息(SYN=m),此时服务器进入SYN_RECV状态
- 第三次握手,客户端收到服务端的SYN+ACK包,向服务端发送确认包ACK(m+1),发送完毕,完成三次握手
四次挥手
- 客户端发送一个FIN,用来关闭客户A到服务端的数据传送。
- 服务端收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
- 服务端关闭与客户端A的连接,发送一个FIN给客户端。
- 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
注:三次握手与四次挥手有一个反馈机制,客户端往服务端发送消息,必须要有服务端确认,如果服务端没有确认,客户端就会在某个时间不停的发送
练习
'''
2.基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端
注意: 执行系统指令使用subprocess模块完成.
'''
# server.py
import socket
import subprocess
server = socket.socket()
server.bind(
('127.0.0.1', 8888)
)
server.listen(5)
while True:
conn, addr = server.accept()
print(addr)
while True:
try:
cmd = conn.recv(1024).decode('utf-8')
print('来自客户端的命令:', cmd)
if len(cmd) == 0:
continue
if cmd == 'q':
break
res = subprocess.Popen(cmd, shell=True,
stderr=subprocess.PIPE,
#stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
data1 = res.stdout.read()
data2 = res.stderr.read()
conn.send(data1 + data2)
print('客户端中内容为:
', (data1+data2).decode('gbk'))
except Exception as e:
print(e)
break
conn.close()
# client
import socket
client = socket.socket()
client.connect(
('127.0.0.1', 8888)
)
while True:
cmd = input('输入命令:')
client.send(cmd.encode('utf-8'))
if cmd== 'q':
break
data = client.recv(1024).decode('gbk')
print(data)
client.close()