zoukankan      html  css  js  c++  java
  • TCP协议-socket通信

    TCP协议和UDP协议都属于端口协议,属于传输层

    TCP协议 : 可靠的,面向连接,流式协议,安全,效率低     转账,文件传输....

    UDP协议 : 快速,效率高,不可靠              微信,qq等聊天软件.....

    TCP协议建立连接三次握手,断开连接四次挥手

    三次握手:

    客户端        --------------发送syn = 1 seq = 233432(随机序列号)请求建立链接----------->                       服务端
    客户端      <----------发送 ack = 1 + 233432回应,且同时发送 syn = 1 seq = 68578请求建立链接---      服务端
    客户端       ------------------发送ack = 1 + 68578回应,建立链接------------------------>                                服务端

    总共建立两个通道

    syn洪水攻击:一个服务器接收的客户端请求非常多

    TCP协议又称好人协议,有一些黑客,造大量的假ip,发送请求,首先真的ip进不去,然后服务端处理大量的假ip,服务端会定时发送请求,与假ip建立链接,服务端容易崩

    四次挥手:

    客户端            ---发送fin = 1 seq = 34562 请求断开链接---------->               服务端
    客户端            <----------回应ack = 1 + 34562 断开链接---------                    服务端
    客户端           <----------发送fin = 1 seq = 67929请求断开链接----                服务端
    客户端            -------- 回应ack = 1 + 67929 断开链接----------->                    服务端

    注释:客户端给服务端发送完所有数据后,就会马上发送fin请求,关闭客户端到服务端的通道,但是此时服务端到客户端的数据还没有发送完毕,所有需要等到服务端将所有返回给客户端之后,服务端再发送fin数据,关闭另一个通道

    套接字socket

    python中的socket是一个模块,与网络通信相关的模块            在应用层和传输层中间 是socket抽象层

    基于socket进行简单通信

    # 服务端:
    import socket
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # socket.AF_INET   基于网络的socket       socket.SOCK_STREAM:基于TCP协议的socket
    phone.bind(('192.168.16.197',8848))
    # 绑定ip地址和端口     '127.0.0.1'是本地回环地址,只允许本计算机访问,当服务端和客户端都在一个计算机上时,可以使用这个ip
    # 端口号范围在8000--65535
    phone.listen(5)       #监听
    # 服务端可以接收N个链接,但是只能同一时刻回应5个请求
    conn,addr = phone.accept()    # 等待电话   阻塞等待
    # conn = 管道
    # addr = 地址
    from_client_date = conn.recv(1024)     # 每次最多接收1024个字节
    print(from_client_date)
    conn.send(from_client_date.upper())
    conn.close()
    phone.close()
    
    
    
    # 客户端:
    import socket
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   # 括号内参数可以不写,默认
    phone.connect(('192.168.16.69',8888))
    msg = input('>>>')
    phone.send(msg.encode('utf-8'))   #发送字节
    from_server_date = phone.recv(1024)
    print(from_server_date)
    phone.close()

    基于socket的通信循环

    # 服务端:
    import socket
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.bind(('192.168.16.197',8848))
    phone.listen(5)     
    conn,addr = phone.accept()    
    while 1:
        from_client_date = conn.recv(1024)   
        print(from_client_date)
        conn.send(from_client_date.upper())
    conn.close()
    phone.close()
    
    
    # 客户端:
    import socket
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   
    phone.connect(('192.168.16.69',8888))
    while 1:
        msg = input('>>>')
        phone.send(msg.encode('utf-8'))   
        from_server_date = phone.recv(1024)
        print(from_server_date)
    phone.close()

    基于socket的连接循环

    # 服务端:
    import socket
    server = socket.socket()
    server.bind(('127.0.0.1',9045))
    server.listen(5)
    while 1:
        conn,addr = server.accept()
        while 1:
            try:
                from_client_date = conn.recv(1024)
                print(from_client_date.decode('utf-8'))
                content = input('>>>')
                conn.send(content.encode('utf-8'))
            except Exception:
                break
        conn.close()
    server.close()
    
    
    # 客户端:
    import socket
    client = socket.socket()
    client.connect(('192.168.16.69',8888))
    while 1:
        msg = input('>>>')
        if msg.upper() == 'Q':
            break
        client.send(msg.encode('utf-8'))
        from_server_date = client.recv(1024)
        print(from_server_date.decode('utf-8'))
    client.close()
  • 相关阅读:
    noexcept(c++11)
    右值引用和std::move函数(c++11)
    mint-ui 取值
    apicloud 注意事项
    倒计时
    获取第n天日期
    防止split没有切割的变量报错
    return
    时间戳转为日期
    echarts 中 请求后台改变数据
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10408513.html
Copyright © 2011-2022 走看看