• 108.网络编程-TCP/UDP


    网络编程-TCP/UDP

    基本概念

    • IP地址:在互联网上定位一部计算机
      • 192.168.000.000:局域网IP
      • 127.0.0.1:指本机
    • 端口:本机中各个软件的编码
      • 范围0-65535
      • 知名端口:预留端口,一般0-1023
      • 非知名端口:不是预留端口,1024-65535

    TCP/UDP协议

    • SOCKET编程
      • 通过IP加端口的定位方式,发送消息的机制
      • socket(套接字):是一个网络通讯的端点,能实现不同主机的进程通信,网络大多基于socket通信
      • 分为UDP和TCP
      • 客户端CLIENT
      • 服务器端SERVER
    • TCP:安全的面向连接的传输
      • 安全
      • 速度慢
    • UDP:非安全的不面向连接的传输
      • 安全性差
      • 大小限制65kb
      • 没顺序
      • 速度快
      • 即使通讯一般用UDP

    UDP编程

    • Server端流程
      1. 建立socket,socket是负责具体通信的一个实例
      2. 绑定IP地址和PORT
      3. 接受对方发送内容
      4. 给对方反馈,非必须
    • Client端流程
      1. 建立socket
      2. 发送内容到服务器
      3. 接受服务器给定的反馈内容

    -服务器端

    import socket
    #建立socket连接
    #socket.AF_INET(IPV4协议族)或AF_UNIX
    #socket.SOCK_DGRAM(面向非链接UDP)或SOCK_STREAM(面向链接TCP)
    s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    #地址为tuple类型
    #此处用host = socket.gethostname()获取本机名代替127.0.0.1也可
    addr = ("127.0.0.1", 9550)
    s_sock.bind(addr)
    
    #.recvfrom()返回的是一个tuple类型,第一个为接收内容,第二个为对方的地址
    #参数值为缓冲区大小
    #data是bytes格式,必须通过解码,才能得到str格式内容
    js_data, df_addr = s_sock.recvfrom(500)
    
    #解码data信息.decode()默认是utf-8编码
    jm_data = js_data.decode("utf-8")
    
    print(jm_data)
    
    #要给对方发送的消息
    fs_data = "你是谁啊?~~~"
    #编码消息,接受的编码和发送的编码必须一致
    bm_data = fs_data.encode("utf-8")
    #发送编码
    #.sendto()是UDP .send()是TCP
    s_sock.sendto(bm_data, df_addr)
    
    s_sock.close()
    
    • 客户端
    import socket
    
    #建立连接
    s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    #要发送的信息
    fs_data = "你好啊~~"
    
    #编码消息
    bm_data = fs_data.encode("utf-8")
    
    #发送信息
    addr = ("127.0.0.1", 9550)
    s_sock.sendto(bm_data, addr)
    
    #接收消息
    js_data, addr = s_sock.recvfrom(500)
    
    #解码消息
    jm_data = js_data.decode("utf-8")
    
    print(jm_data)
    
    s_sock.close()
    

    TCP编程

    • Server端的流程

      1. 建立socket,可以理解为只是负责接受对方请求
      2. 绑定端口及地址
      3. 监听接入的访问socket
      4. 接受访问的socket,可以理解为真正的建立连接
      5. 接收消息
      6. 给对方反馈,如果有必要
      7. 关闭链接
    • Client端的流程

      1. 建立socket通信
      2. 请求和对方建立通路
      3. 发送信息
      4. 接收反馈,如果有必要
      5. 关闭链接
    • 服务器端

    import socket
    
    s_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    addr = ("127.0.0.1", 9550)
    s_sock.bind(addr)
    
    s_sock.listen()
    
    while True:
    
        #接收客户端建立连接的请求,并建立通讯链路
        #返回值 第一个为真正建立的链路 第二个为对方地址
        rel_sock, addr = s_sock.accept()
    
        #接收信息
        #500是接收的最大数据量
        js_data = rel_sock.recv(500)
    
        #解码
        jm_data = js_data.decode("utf-8")
    
        print(jm_data, addr)
    
        #编码
        fs_data = "你是谁啊? ~~"
        bm_data = fs_data.encode("utf-8")
    
        #发送
        rel_sock.send(bm_data)
    
        rel_sock.close()
    
    • 客户端
    import socket
    
    s_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    #通过服务器的IP,和服务器建立连接
    fwq_addr = ("127.0.0.1", 9550)
    s_sock.connect(fwq_addr)
    
    #编码信息
    fs_data = "你好啊~~"
    bm_data = fs_data.encode("utf-8")
    
    #发送信息
    s_sock.send(bm_data)
    
    #接收信息
    js_data = s_sock.recv(500)
    
    #解码信息
    jm_data = js_data.decode("utf-8")
    
    print(jm_data)
    
    s_sock.close()
    
  • 相关阅读:
    202231
    搞机经验总结
    Maven最佳实践
    win10双系统安装
    C#前台js调用后台代码和后台代码调用前台js
    DataList的使用+分页
    异步中的跨线程赋值问题
    javascript中async/await常用场景
    20. 有效的括号
    53. 最大子数组和(动态规划)
  • 原文地址:https://www.cnblogs.com/TK-tank/p/12329241.html
Copyright © 2020-2023  润新知