Python之TCP网络编程

news2025/1/9 16:53:12

目录

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.关闭客户端套接字(挂电话)

import socket

if __name__ == '__main__':
    # 1.创建客户端套接字对象(AF_INET表示IP地址类型是IPv4,SOCK_STREAM表示传输协议类型是TCP)
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.和服务端套接字建立连接
    tcp_client_socket.connect(("192.168.56.1",8080))

    # 3.发送数据
    tcp_client_socket.send("nihaoma".encode(encoding="utf-8"))

    # 4.接受数据(recv阻塞等待数据的到来)
    recv_data = tcp_client_socket.recv(1024)
    # decode函数的字符集默认是utf-8
    print("客户端接收到的数据:",recv_data.decode())

    # 5.关闭客户端套接字
    tcp_client_socket.close()

客户端发送:

nihaoma

服务端接收:

服务端发送:

客户端接收:

2.4 TCP服务端程序开发

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

2.绑定IP地址和端口号

3.设置监听

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

5.接收数据

6.发送数据

7.关闭套接字

import socket

if __name__ == '__main__':
    # 1.创建服务端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用(程序退出时,端口号立即释放)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2.绑定IP地址和端口号
    # tcp_server_socket.bind(("192.168.43.163",8888))
    # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
    tcp_server_socket.bind(("", 8888))

    # 3.设置监听(128代表服务端等待排队连接的最大数量)
    tcp_server_socket.listen(128)

    # 4.等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
    conn_socket, ip_port = tcp_server_socket.accept()
    print("客户端地址:", ip_port)

    # 5.接收数据
    recv_data = conn_socket.recv(1024)
    print("服务端接收到的数据:",recv_data.decode())

    # 6.发送数据
    conn_socket.send("nihao".encode())

    # 7.关闭套接字
    conn_socket.close()
    tcp_server_socket.close()

客户端发送:

服务端接收:

服务端发送:

nihao

客户端接收:

 

2.5 注意点

3. socket之send和recv原理

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

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

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

4. 案例

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

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

import socket
import threading

def handle_client(conn_socket):
    # 3.5接收数据
    recv_data = conn_socket.recv(1024)
    print("服务端接收到的数据:", recv_data.decode())

    # 3.6发送数据
    conn_socket.send("nihao".encode())

    # 3.7关闭与客户端通信的套接字
    conn_socket.close()

if __name__ == '__main__':
    # 1.创建服务端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2.绑定IP地址和端口号
    # tcp_server_socket.bind(("192.168.43.163",8888))
    # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
    tcp_server_socket.bind(("", 8888))

    # 3.循环接收客户端的连接请求
    while True:
        # 3.1设置监听(128代表服务端等待排队连接的最大数量)
        tcp_server_socket.listen(128)

        # 3.2等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
        conn_socket, ip_port = tcp_server_socket.accept()
        print("客户端地址:", ip_port)

        # 3.3创建多线程用来同时接收多个客户端的请求
        sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))

        # 3.4启动线程执行任务
        sub_thread.start()

    # 4.关闭服务端套接字
    tcp_server_socket.close()

服务端:

客户端1:

客户端2:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.1 get()

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.1 get()15 Proxy 15.2 Proxy 实例的方法 拦截方法的详细介绍。 15.2.1 get() get方…

应急响应-进程排查

进程排查 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。无论在Windows还是Linux中,主机在感染恶意程序后,恶意程序都会启动相应进程来完成恶意操作。 Window…

Android 深入理解View.post() 、Window加载View原理

文章目录背景:如何在onCreate()中获取View的宽高?View.post()原理Window加载View流程setContentView()ActivityThread#handleResumeActivity()总结扩展Window、Activity及View三者之间的关系是否可以在子线程中更新UI资料背景:如何在onCreate…

m认知无线电信号检测算法matlab仿真,能量检测,循环平稳检测以及自相关检测

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 频谱感测是认知无线电的一项关键技术。我们将频谱感知作为一个分类问题,提出一种基于深度学习分类的感知方法。我们归一化接收信号功率以克服噪声功率不确定性的影响。我们使…

postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断

一、 难以理解的场景 postgresql源码学习(十九)—— MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数_Hehuyi_In的博客-CSDN博客 在前篇的可见性判断中有个一直没想明白的问题 —— 本事务插入的数据,什么场景可能会出现去查询获取快照后插入…

路面坑洼检测中的视觉算法

3D道路成像和路面坑洼检测的经典工作综述。论文链接:https://arxiv.org/pdf/2204.13590.pdf 计算机视觉算法在3D道路成像和路面坑洼检测中的应用已有二十多年的历史。这里先介绍了用于2D和3D道路数据采集的传感系统,包括摄像机、激光扫描仪和微软Kinect…

汉兰达汽车发动机怠速抖动故障诊断方案设计

目录 一、课题简介 1 1.1课题基本内容 1 1.2课题解决的主要问题 1 1.3课题设计思路 1 二、毕业设计成果 2 2.1汉兰达汽车发动机怠速抖动故障现象描述 2 2.2 汉兰达汽车发动机怠速抖动故障原因分析 2 2.3汉兰达汽车发动机怠速抖动故障诊断与排除 6 2.4维修结论与建议 12 三、毕业…

java sleep yield join区别

1、sleep:让出CPU调度,Thread类的方法,必须带一个时间参数。会让当前线程休眠进入阻塞状态并释放CPU(阿里面试题 Sleep释放CPU,wait 也会释放cpu,因为cpu资源太宝贵了,只有在线程running的时候&…

高效正则匹配工具

很多人都用过正则,但文章或许会给你一种全新的认识(思考) 以下内容适合高效率正则匹配(比较适合正则匹配场景较多的情况) 效率提升精华:本地缓存减少编译次数(对effective java的思考,以及对数据库连接中…

Java中的装包(装箱)和拆包(装包)

装箱和拆箱 在Java的学习中,我们有的时候会设计装箱和拆箱的概念(也就是常说的装包和拆包),这篇博客将详细讲解一下装箱和拆箱的概念及其用途。 装箱(装包):将基本数据类型转换成包装类类型 拆…

websocket给指定客户端推送消息

业务场景 最近有一个业务场景是要做实时语音转义,考虑到实时性,所以决定采用websocket实现。 业务场景是A客户端(手机)进行语音转义的结果实时同步到B客户端(pc),这就需要用到websocket将A转义的结果发送给服务端,服务端接收到A…

软件工程经济学复习题答案

1、利润 收入-成本费用 2、资产 流动资产非流动资产 3、显性成本可以用货币计量,是可以在会计的帐目上反映出来的 4、领取什么保险应缴纳个人所得税 商业保险 某企业一项固定资产的原价为8000 000元,预计使用年限为6年,预计净残值为5 0…

[LeetCode周赛复盘] 第 320 场周赛20221120

[LeetCode周赛复盘] 第 320 场周赛20221120 一、本周周赛总结二、 [Easy] 6241. 数组中不等三元组的数目1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6242. 二叉搜索树最近节点查询1. 题目描述2. 思路分析3. 代码实现四、[Hard] 6243. 到达首都的最少油耗1. 题目描述2. 思路…

10_libpcap以及libnet

知识点1【飞秋欺骗】 1、windwos安装飞秋 双击运行 2、ubuntu安装飞秋 sudo apt-get install iptux ubuntu运行飞秋:iptux& 3、飞秋的格式: 版本:包编号:用户名:主机名:命令字:附加消息 飞秋的端口是2425固定的 1表示上线 32表示普通消息 1_i…

(经典dp) hdu 递推求解专题练习

文章目录前言题单hdu2044 一只小蜜蜂...hdu2045 不容易系列之(3)—— LELE的RPG难题hdu2046 骨牌铺方格hdu2047 阿牛的EOF牛肉串hdu2048 神、上帝以及老天爷hdu2049 不容易系列之(4)——考新郎hdu2050 折线分割平面END前言 题单:递推求解专题练习(For Be…

华为机试 - 找出经过特定点的路径长度

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 无 输入描述 输入一个字符串,都是以大写字母组成,每个相邻的距离是 1, 第二行输入一个字符串,表示必过的点。 说明每个点可过多次。 输出描述 经过这…

精益(Lean)与ERP实施

周四、五看完了24小时不停的Lean Global Connection,总觉得要说些什么。 印象最深的有三个地方: 一是John Shook的话,他说Lean是一种Mindset。 这种Mindset是: 一种积极的态度,Problems solving, 把问题和挑战当成是…

Web 性能优化:TLS

个人博客 Web 性能优化:TCP🎯 Web 性能优化:TLSWeb 性能优化:HTTP “do it, do it work, do it better … and secure ☠️” 随着追逐利益而来的恶意参与者越来越多,当前的 Web 应用,已经从野蛮生长转而…

【通关MySQL】Java的JDBC编程

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【通关MySQL】 ✈️✈️本篇内容:Java的JDBC编程。 🚀🚀代码存放仓库gitee:MySQL码云存放! ⛵⛵作者简介&#xff…

[附源码]java毕业设计-室内田径馆预约管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…