• 第四十九篇 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'))
    
  • 相关阅读:
    5359. 最大的团队表现值
    Trie树模板
    [NOIP 2009] 细胞分裂(选做)
    【SpringCloud】07.应用间的通信
    【SpringCloud】06.Eureka 总结
    【SpringCloud】05.Eureka的高可用
    【SpringCloud】04.SpringCloud Eureka Server与Client的创建
    【SpringCloud】03.微服务的设计原则
    【SpringCloud】02.微服务与SpringCloud
    【SpringCloud】01.常见软件架构的区别
  • 原文地址:https://www.cnblogs.com/itboy-newking/p/11185283.html
Copyright © 2020-2023  润新知