第四十九篇 socket套接字编程

一、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'))

猜你喜欢

转载自www.cnblogs.com/itboy-newking/p/11185283.html