• Python之TCP网络编程


    目录

    1. python3编码转换

    2. TCP网络应用程序开发

    2.1 概述

    2.2 开发流程

     2.3 TCP客户端程序开发

    2.4 TCP服务端程序开发

    2.5 注意点

    3. socket之send和recv原理

    4. 案例


    1. python3编码转换

    1.网络传输是以二进制数据进行传输的。

    2.数据转化用到了encode和decode函数

    • str.encode(encoding="utf-8")
    • bytes.decode(encoding="utf-8")

    2. TCP网络应用程序开发

    2.1 概述

    1.TCP网络应用程序开发分为客户端程序开发和服务端程序开发。

    2.主动发起建立连接请求的是客户端程序。

    3.等待接受连接请求的是服务端程序。

    2.2 开发流程

     2.3 TCP客户端程序开发

    1.创建客户端套接字对象(买电话)

    2.和服务端套接字建立连接(打电话)

    3.发送数据(说话)

    4.接收数据(接听)

    5.关闭客户端套接字(挂电话)

    1. import socket
    2. if __name__ == '__main__':
    3. # 1.创建客户端套接字对象(AF_INET表示IP地址类型是IPv4,SOCK_STREAM表示传输协议类型是TCP)
    4. tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    5. # 2.和服务端套接字建立连接
    6. tcp_client_socket.connect(("192.168.56.1",8080))
    7. # 3.发送数据
    8. tcp_client_socket.send("nihaoma".encode(encoding="utf-8"))
    9. # 4.接受数据(recv阻塞等待数据的到来)
    10. recv_data = tcp_client_socket.recv(1024)
    11. # decode函数的字符集默认是utf-8
    12. print("客户端接收到的数据:",recv_data.decode())
    13. # 5.关闭客户端套接字
    14. tcp_client_socket.close()

    客户端发送:

    nihaoma

    服务端接收:

    服务端发送:

    客户端接收:

    2.4 TCP服务端程序开发

    1.创建服务端套接字对象

    2.绑定IP地址和端口号

    3.设置监听

    4.等待接受客户端的连接请求

    5.接收数据

    6.发送数据

    7.关闭套接字

    1. import socket
    2. if __name__ == '__main__':
    3. # 1.创建服务端套接字对象
    4. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    5. # 设置端口复用(程序退出时,端口号立即释放)
    6. tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    7. # 2.绑定IP地址和端口号
    8. # tcp_server_socket.bind(("192.168.43.163",8888))
    9. # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
    10. tcp_server_socket.bind(("", 8888))
    11. # 3.设置监听(128代表服务端等待排队连接的最大数量)
    12. tcp_server_socket.listen(128)
    13. # 4.等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
    14. conn_socket, ip_port = tcp_server_socket.accept()
    15. print("客户端地址:", ip_port)
    16. # 5.接收数据
    17. recv_data = conn_socket.recv(1024)
    18. print("服务端接收到的数据:",recv_data.decode())
    19. # 6.发送数据
    20. conn_socket.send("nihao".encode())
    21. # 7.关闭套接字
    22. conn_socket.close()
    23. tcp_server_socket.close()

    客户端发送:

    服务端接收:

    服务端发送:

    nihao

    客户端接收:

     

    2.5 注意点

    3. socket之send和recv原理

    不管是recv还是send都不是直接接收到对方的数据和发送数据到对方。

    发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取。

    发送数据和接收数据最终是由操作系统控制网卡来完成。

    4. 案例

    开发一个多任务版TCP服务端程序,实现一个服务端同时服务多个客户端。

    分析:多个需要用到循环,同时需要用到多线程。

    1. import socket
    2. import threading
    3. def handle_client(conn_socket):
    4. # 3.5接收数据
    5. recv_data = conn_socket.recv(1024)
    6. print("服务端接收到的数据:", recv_data.decode())
    7. # 3.6发送数据
    8. conn_socket.send("nihao".encode())
    9. # 3.7关闭与客户端通信的套接字
    10. conn_socket.close()
    11. if __name__ == '__main__':
    12. # 1.创建服务端套接字对象
    13. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    14. # 设置端口复用
    15. tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    16. # 2.绑定IP地址和端口号
    17. # tcp_server_socket.bind(("192.168.43.163",8888))
    18. # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
    19. tcp_server_socket.bind(("", 8888))
    20. # 3.循环接收客户端的连接请求
    21. while True:
    22. # 3.1设置监听(128代表服务端等待排队连接的最大数量)
    23. tcp_server_socket.listen(128)
    24. # 3.2等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
    25. conn_socket, ip_port = tcp_server_socket.accept()
    26. print("客户端地址:", ip_port)
    27. # 3.3创建多线程用来同时接收多个客户端的请求
    28. sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))
    29. # 3.4启动线程执行任务
    30. sub_thread.start()
    31. # 4.关闭服务端套接字
    32. tcp_server_socket.close()

    服务端:

    客户端1:

    客户端2:

     

  • 相关阅读:
    Attention机制学习记录(四)之Transformer
    RabbitMQ(二)
    I/O复用--浅谈epoll
    计算机中的编码问题
    Git,Gitee,GitHub使用总结(内含命令行详细操作)
    计算机概述
    Dubbo环境搭建
    踩坑笔记 NFS坑-2个pod读写文件延迟问题
    每日学术速递5.28
    Centos7-Failed to start LSB: Bring up/down networking
  • 原文地址:https://blog.csdn.net/m0_60121089/article/details/127953350