zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    SpringBoot(三) 配置文件 篇章
    SpringBoot(二):SpringBoot 热部署
    SSM框架之Spring(2)IOC及依赖注入
    SSM框架之spring(1)
    SSM框架之Mybatis(6)动态SQL
    SSM框架之Mybatis(5)数据库连接池及事务
    SSM框架之Mybatis(4)SqlMapConfig
    SSM框架之Mybatis(3)dao层开发
    SSM框架之Mybatis(2)CRUD操作
    JavaEE之Hibernate(开放源代码的对象关系映射框架)
  • 原文地址:https://www.cnblogs.com/setcreed/p/11695232.html
Copyright © 2011-2022 走看看