スリーウェイハンドシェイクのビルド接続:
良好な接続を確立し、双方向チャネルを確立します。
スリーウェイハンドシェイク:
最初のハンドシェイクが:接続が確立され、クライアントはサーバーにSYNパケットを送信し、SYN_SENT状態に入る、サーバが確認するのを待つ
秒ハンドシェイクを:サーバーは、シンパケットを受信し、SYNパケットを送信している間、顧客のSYNを確認しますすなわちSYN + ACKパケットは、サーバが状態SYN_RECVに入り、
第三のハンドシェーク:クライアントがサーバにSYN + ACKパケットを受信し、サーバは受信確認パケットACK(ACK = Y + 1)を送信し 、 このパケットの送信が完了すると、クライアントクライアントとサーバーESTABLISHED(TCP接続が成功した)状態に、3ウェイハンドシェイクを完了します。接続破り四波:
最初のクライアントがサーバにFIN要求を送信し、データの送信を停止します。クライアントは、FIN-WAIT-1(1つの終端待ち)状態になります。
第二に、サーバは、要求、ACK確認、CLOSE-WAITにサーバ(オフ待機)状態を受信します。
クライアントが、その場合には、確認サーバを受信した後に待機は、クライアントが入る(最後のデータは、サーバによって送信されることが同意する必要があります)サーバーが要求FIN FIN-WAIT-2を送信するために待っている、(2終了待ち)状態。
三回目の後、サーバーは、サーバーは、クライアントの承認を待って、LAST-ACK(確認応答の最後の)状態になり、最後のデータがFINを送信するために、クライアントが要求を完了し送信します。
第四に、クライアントは、クライアントは、TIME-WAIT(待機)状態になり、サーバーが送信FIN、ACK応答を受け取る要求します。(注:この時点ではTCP接続が解放されていない、クライアントは、対応するTCBを取り消すのみ限り、サーバーがクライアントから送信された確認を受けたとして、CLOSED状態に入るとき、(2MSLを通じて最大セグメント寿命)時間をかけてきました今CLOSED状態に入る。同様に、TCBの失効後、TCP接続を介して、以前、クライアントよりもサーバーのTCPコネクションの終了時刻を見ることができます。)
2.基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端
注意: 执行系统指令使用subprocess模块完成.
server 端代码:
import socket
import subprocess
server = socket.socket()
server.bind(('127.0.0.1', 9527))
server.listen(5)
while True:
conn, addr = server.accept()
while True:
try:
cmd = conn.recv(1024).decode('utf8')
print(f'接收到命令:{cmd}')
if cmd == 'q':
break
res = subprocess.check_call([cmd])
if str(res) == '0':
msg = '命令执行成功!'
else:
msg = f'命令执行失败!{str(res)}'
send_msg = conn.send(msg.encode('utf8'))
except Exception as e:
print(e)
send_msg = conn.send(str(e).encode('utf8'))
continue
conn.close()
client 端代码
import socket
client = socket.socket()
client.connect(('127.0.0.1', 9527))
while True:
send_msg = input('给服务器发送命令:')
client.send(send_msg.encode('utf8'))
if send_msg == 'q':
break
data = client.recv(1024).decode('utf8')
print(f'服务器返回信息:{data}')
client.close()
注意:用以上两段代码模拟客户端和服务器,代码要在两个命令框执行(python解释器不行),并且要先执行server,只有server开始监听了,client才能连接。