TCP编程

news2025/1/10 21:00:27

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

由于TCP连接具有安全可靠的特性,所以TCP应用更为广泛。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。例如,当我们在浏览器中访问明日学院网站时,我们自己的计算机就是客户端,浏览器会主动向明日学院的服务器发起连接。如果一切顺利,明日学院的服务器接收了我们的连接,一个TCP连接就建立起来了,后面的通信就是发送网页内容了。

1  创建TCP服务器

创建TCP服务器的过程,类似于生活中接听电话的过程。如果要接听别人的来电,首先需要购买一部手机,然后安装手机卡。接下来,设置手机为接听状态,最后静等对方来电。

如同上面的接听电话过程一样,在程序中,如果想要完成一个TCP服务器的功能,需要的流程如下:

l  使用socket()创建一个套接字

l  使用bind()绑定IP和port

l  使用listen()使套接字变为可被动连接

l  使用accept()等待客户端的连接

l  使用recv/send()接收发送数据

图标 (35)

  实例01  服务器向浏览器发送“Hello World”

例如,使用socket模块,通过客户端浏览器向本地服务器(IP地址为127.0.0.1)发起请求,服务器接到请求,向浏览器发送“Hello World”。具体代码如下: 

# -*- coding:utf-8 -*-

import socket                                  # 导入socket模块

host = '127.0.0.1'                            # 主机IP

port = 8080                                     # 端口号

web = socket.socket()                           # 创建socket对象

web.bind((host,port))                          # 绑定端口

web.listen(5)                                # 设置最多连接数

print ('服务器等待客户端连接...')

# 开启死循环

while True:

    conn,addr = web.accept()                     # 建立客户端连接

    data = conn.recv(1024)                       # 获取客户端请求数据

    print(data)                             # 打印接收到的数据

    conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World')        # 向客户端发送数据

    conn.close()                             # 关闭连接

运行结果如图7所示。然后打开谷歌浏览器,输入网址:127.0.0.1:8080(服务器IP地址是127.0.0.1,端口号是8080),成功连接服务器以后,浏览器显示“Hello World”。运行结果如图8所示。

图7  服务器接收到的请求

图8  客户端接到的响应

2  创建TCP客户端

TCP的客户端要比服务器简单很多,如果说服务器是需要自己买手机、插手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多。

图标 (35)

  实例02  客户端向服务器发送和接收信息

在实例01中,我们使用浏览器作为客户端接收数据,下面,创建一个TCP客户端,通过该客户端向服务器发送和接收消息。创建一个client.py文件,具体代码如下:

import socket                       # 导入socket模块

s= socket.socket()                  # 创建TCP/IP套接字

host = '127.0.0.1'                  # 获取主机地址

port = 8080                        # 设置端口号    

s.connect((host,port))                 # 主动初始化TCP服务器连接

send_data = input("请输入要发送的数据:")        # 提示用户输入数据

s.send(send_data.encode())             # 发送TCP数据

# 接收对方发送过来的数据,最大接收1024个字节

recvData = s.recv(1024).decode()

print('接收到的数据为:',recvData)

# 关闭套接字

s.close()

打开2个cmd命令行窗口,先运行实例01中的server.py文件,然后运行client.py文件。接着,在client.py窗口输入“hi”,此时server.py窗口会接收到消息,并且发送“Hello World”。运行结果如图9所示。

图9  客户端和服务器通信效果

3  执行TCP服务器和客户端

在上面的例子中,我们设置了一个服务器和一个客户端,并且实现了客户端和服务器之间的通信。根据服务器和客户端的执行流程,可以总结出TCP客户端和服务器的通信模型,如图10所示。

图标 (35)

  实例03  制作简易聊天窗口

既然客户端和服务器可以使用Socket进行通信,那么,客户端就可以向服务器发送文字,服务器接到消息后,显示消息内容并且输入文字返回给客户端。客户接收到响应,显示该文字,然后继续向服务器发送消息。这样,就可以实现一个简易的聊天窗口。当有一方输入“byebye”时,则退出系统,中断聊天。可以根据如下步骤实现该功能。

图10  TCP通信模型

(1)创建server.py文件,作为服务器程序,具体代码如下: 

import socket                               # 导入socket模块

host = socket.gethostname()                 # 获取主机地址

port = 12345                                # 设置端口号  

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)     # 创建TCP/IP套接字

s.bind((host,port))                     # 绑定地址(host,port)到套接字

s.listen(1)                         # 设置最多连接数量

sock,addr = s.accept()                    # 被动接收TCP客户端连接

print('连接已经建立')

info = sock.recv(1024).decode()                 # 接收客户端数据

while info != 'byebye':                      # 判断是否退出

  if info :

    print('接收到的内容:'+info)

  send_data = input('输入发送内容:')               # 发送消息

  sock.send(send_data.encode())                 # 发送TCP数据

  if send_data =='byebye':                  # 如果发送byebye,则退出

    break

  info = sock.recv(1024).decode()             # 接收客户端数据

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

s.close()                            # 关闭服务器套接字

(2)创建client.py文件,作为客户端程序,具体代码如下:

import socket                       # 导入socket模块

s= socket.socket()                  # 创建TCP/IP套接字

host = socket.gethostname()             # 获取主机地址

port = 12345                        # 设置端口号

s.connect((host,port))                 # 主动初始化TCP服务器连接

print('已连接')

info = ''          

while info != 'byebye':                  # 判断是否退出

  send_data=input('输入发送内容:')            # 输入内容

  s.send(send_data.encode())             # 发送TCP数据

  if send_data =='byebye':                # 判断是否退出

    break

  info = s.recv(1024).decode()             # 接收服务器数据

  print('接收到的内容:'+info)

s.close()                         # 关闭套接字

打开2个cmd命令行窗口,分别运行server.py和client.py文件,如图11所示。

图11  服务器和客户端建立连接

接下来,在client.py窗口中,输入“土豆土豆,我是地瓜,收到请回答。over”,然后按下<Enter>键。此时,在server.py窗口中将显示client.py窗口发送的消息,并提示server.py窗口输入发送内容,如图12所示。

图12  发送消息

当输入“byebye”时,结束对话,如图13所示。

图13  关闭对话

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

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

相关文章

华为设备SSH远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑SSH 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户SSH 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录接入用…

东芝-Soft Limit 报警及其解决办法

灵感来源与生活,在生活中总能有意想不到的惊喜,下面来看看小编今天的惊喜!!! 今天不知道怎么了,有人来找就说是机器人坏了,一直报警,重启关机回原点也没有用。 意外到来,只能使用手柄将控制器打手动,来看看报警显示什么。 下面就看到了这,我靠第一次看见,只能看看手…

【决战欧洲之巅】苏格兰VS瑞士-AI预测走地数据

初步分析 苏格兰队是欧洲杯的老牌球队&#xff0c;虽然首场比赛表现不佳&#xff0c;但他们的实力不容小觑。苏格兰在预选赛中表现出色&#xff0c;以小组第二的身份晋级&#xff0c;并拥有包括多名英超球员在内的强大阵容&#xff0c;如曼联中场麦克托米奈和利物浦右后卫罗伯…

【Android面试八股文】你刚刚提到了V2签名使用美团的Walle实现多渠道打包,那么你能讲一讲Android 签名的 v1、v2、v3、v4版本的区别吗?

文章目录 前言一、简介二、APK 签名方案 v1 (JAR签名)2.1. 签名过程2.2 验证过程2.3 详细例子2.4 优缺点2.5 美团基于V1版本的多渠道打包方案三、APK 签名方案 v23.1 为什么要设计APK 签名方案 v2 ?3.2 APK 签名方案 v2 : 签名前和签名后的 APK3.2.1 签名前和签名后的 APK3.2…

后端不提供文件流接口,前台js使用a标签实现当前表格数据(数组非blob数据)下载成Excel

前言&#xff1a;开发过程中遇到的一些业务场景&#xff0c;如果第三方不让使用&#xff0c;后端不提供接口&#xff0c;就只能拿到table数据(Array)&#xff0c;实现excel文件下载。 废话不多说&#xff0c;直接上代码&#xff0c;方法后续自行封装即可&#xff1a; functio…

7亿中国男人,今年夏天都在穿什么?

文丨郭梦仪 北京气温已经逼近38度&#xff0c;注重防晒的人群中这次多了男人的身影。 程序员宇宙中心&#xff0c;清河万象汇西区&#xff0c;小米su7吸引众多男士前来观摩&#xff0c;和对面蕉下门店里的“防晒衣大军”恰好呼应上了。 北京清河万象汇的防晒衣专卖店 夏日将…

C++ 计算凸包点的最小旋转矩形

RotateRect.h #include <vector>/** * brief 计算点集最小旋转外接矩形 */ class RotateRect { public:enum { CALIPERS_MAXHEIGHT 0, CALIPERS_MINAREARECT 1, CALIPERS_MAXDIST 2 };struct Point {float x, y;};using Points std::vector<Point>;struct Size…

ASP .Net Core创建一个httppost请求并添加证书

ASP .Net Core创建一个httppost请求并添加证书 创建.net Core程序&#xff0c;使用自签名证书&#xff0c;可以处理https的get和post请求。 创建证书 创建自签名证书的流程可以在这里查看&#xff1a; https://blog.csdn.net/GoodCooking/article/details/139815278创建完毕…

【Python】一文向您详细解析内置装饰器 @lru_cache

【Python】一文向您详细解析内置装饰器 lru_cache 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&a…

鸿蒙开发通信与连接:【@ohos.nfc.tag (标准NFC-Tag)】

标准NFC-Tag 本模块主要用于操作及管理NFC Tag。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import tag from ohos.nfc.tag;tag.getNfcATag getNfcATag(tagInfo: TagInfo): Nf…

劲爆!Kimi月之暗面可以接入微信,创建自己个性化的AI Agent(人工智能体) (一)

前言 随着人工智能技术的不断发展&#xff0c;越来越多的企业和个人开始关注如何利用AI技术提升用户体验和交互效果。本文将介绍如何使用抖音的扣子&#xff08;Douyin Button&#xff09;配置自己的AI Agent&#xff0c;搭载kimi, 实现智能互动&#xff0c;提升用户体验。 k…

【Python机器学习实战】 | 基于PCA主成分分析技术读入空气质量监测数据进行数据预处理并计算空气质量综合评测结果

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

LeetCode 1164, 125, 94

目录 1164. 指定日期的产品价格题目链接表要求知识点思路代码 125. 验证回文串题目链接标签简单版思路代码 复杂版思路代码 94. 二叉树的中序遍历题目链接标签递归思路代码 迭代思路代码 1164. 指定日期的产品价格 题目链接 1164. 指定日期的产品价格 表 表Products的字段为…

LVGL使用GUI Guider配置STM32界面详细笔记教程

0、说明 接着前面几篇博客对LVGL的使用和介绍&#xff0c;这篇博客主要是使用和介绍快速配置LVGL图形界面编程的工具&#xff0c;GUI Guider。本文使用的工程代码&#xff0c;均是基于前几篇博客的基础上的&#xff0c;如需下载已配置好的LVGL-MCU工程环境&#xff0c;可通过如…

docker启动nacos挂载目录并修改配置文件

1 通过 Docker 拉取 nacos 镜像 docker pull nacos/nacos-server:v2.1.22 创建宿主机挂载目录 # 用于挂载 nacos 的日志 mkdir -p /mydata/nacos_home/logs/ # 用于挂载 nacos 的配置 mkdir -p /mydata/nacos_home/conf/ # 用于挂载 nacos 的数据 mkdir -p /mydata/nacos_hom…

接口联调测试工作总结

接口联调测试工作已经告一段落&#xff0c;现在总结如下: 1、首先接口联调测试的价值 2、接口联调要有工作思路 3、接口联调工作准备 4、接口联调测试数据设计 5、接口联调脚本研发 6、脚本联调测试 测试业务本身需要接口联调调用 独立接口正确&#xff0c;但有可能接口…

三甲硅烷基胺(TSA)可用作半导体前驱体材料 南大光电为我国代表企业

三甲硅烷基胺&#xff08;TSA&#xff09;可用作半导体前驱体材料 南大光电为我国代表企业 三甲硅烷基胺&#xff08;TSA&#xff09;是一种无机化合物&#xff0c;分子式为&#xff08;SiH3&#xff09;3N&#xff0c;其外观呈无色流动性液体。三甲硅烷基胺具有易水解、自燃性…

Java面向对象的三大特性之一——继承

目录 一、继承概念 二、为什么要继承 三、继承语法&#xff08;关键字extends&#xff09; 四、父类成员访问 1、子类中访问父类的成员变量 &#xff08;1&#xff09;子类和父类不存在同名的成员变量 &#xff08;2&#xff09;子类和父类中存在同名的成员变量 2、子类中访…

CVPR 2024揭幕,清华大学论文接收量霸榜,轻松碾压斯坦福、麻省理工

CVPR2024 会议之眼 快讯 会议介绍 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月17日至21日正在美国西雅图召开。CVPR是计算机视觉和模式识别领域的顶级会议之一。与ICCV和ECCV并称为计算…

Vue中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的&#xff0c;如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧&#xff01; 1.在el-form中绑定一个ref&#xff0c;名字自拟,后续触发检验结果…