TCP编程

自学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.mfbz.cn/a/739585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短剧cps分销系统,热门短剧项目怎么做?短剧cps分销系统搭建开发

目录 前言&#xff1a; 一、短剧分销怎么做&#xff1f; 1&#xff1a;推广达人&#xff1a; 2&#xff1a;做一款短剧分销小程序&#xff1a; 3&#xff1a;搭建短剧看剧系统&#xff1a; 二、短剧分销系统的分销比例有多少呢&#xff1f; 三、总结 前言&#xff1a; 当…

20240624(周一)AH股行情总结:A股低开低走, 恒生科技指数跌2%,贵州茅台转跌为涨

内容提要 A股三大指数收盘均跌超1%&#xff0c;半导体、智慧医疗、商业航天概念领跌&#xff0c;中芯国际跌超3%&#xff0c;盘中一度涨2%。水电股逆势走强&#xff1b;白酒股低开高走&#xff0c;贵州茅台翻红&#xff0c;盘初曾跌3%。微盘股指数大跌4%。 正文 周一&#x…

中霖教育:二级建造师报名后缺考有影响吗?

在完成二级建造师的报名程序后&#xff0c;考生无法进行退考。如果是不参加考试&#xff0c;可以选择弃考。弃考对个人并没有负面影响&#xff0c;缺席考试的话也不会被记录在个人诚信档案中。当然&#xff0c;如果弃考的话此次考试的成绩将被记为0&#xff0c;下一年参加考试按…

qt 简单实验 用代码添加控件

1.概要 2.代码 #include "dialog.h" #include "ui_dialog.h" #include <QPushButton>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);QPushButton *button new QPushButton("My Button",…

av1支持的CU划分

av1只有4叉划分支持递归划分 只有四叉允许递归划分&#xff0c;其余划分只划分到本层。最大编码单元也扩展到128x128&#xff0c;最小编码单元4x4。

记一次服务器崩溃事件

今天在安装Jenkins的时候&#xff0c;进行到插件安装这一步&#xff0c;本来一切顺利&#xff0c;结果最后安装完成之后一直进不去网页&#xff0c;显示连接超时&#xff0c;网上搜索了一圈也没发现什么相似的情况&#xff0c;当我疑惑的时候回到Linux控制台&#xff0c;发现命…

自动驾驶ADAS

1 ToF摄像头分类 1.1 ToF原理 类似雷达测距&#xff0c;生成3D点云&#xff0c;或者叫3D贴图。ToF相机的分辨率一般在3万像素左右。ToF距离计算公式如图所示。 Figure 1-1 ToF距离计算公式 D&#xff1a;距离 c&#xff1a;光速 PHI&#xff1a;相位差 fmod&#xff1a;调制频率…

React 生命周期,对比vue学习

所谓生命周期就是代码被读取到的那一刻到页面渲染完成的历程 react 的生命周期相比较 vue 会显得复杂点 钩子链接&#xff1a; https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/ 整个过程被分成了三部分&#xff1a;挂载时、更新时、卸载时 1.挂载时 挂载时…

智汇云舟参编又一项国家标准

近日&#xff0c;智汇云舟参与了《信息技术 数字孪生能力成熟度模型》国家标准的编制工作。该标准由中国电子技术标准化研究院牵头&#xff0c;全国信息技术标准化技术委员会归口&#xff0c;北京航空航天大学、重庆邮电大学 、南方电网、腾讯云、安世亚太等知名高校、企业共同…

ONLYOFFICE 桌面编辑器 8.1

ONLYOFFICE 简介 ONLYOFFICE 是一个开源的办公套件&#xff0c;它提供了在线文档编辑器、表格编辑器和演示文稿编辑器&#xff0c;这些编辑器能够兼容 Microsoft Office 格式&#xff08;.docx, .xlsx, .pptx&#xff09;以及其他流行的标准格式。ONLYOFFICE 的核心功能包括多…

【转】5种常见的网络钓鱼攻击以及防护手段

2022 年 Verizon 数据泄露调查报告指出&#xff0c;去年 75% 的社会工程攻击涉及网络钓鱼&#xff0c;仅去年一年就有超过 33 万个账户被网络钓鱼&#xff0c;网络钓鱼占整体社会工程攻击的 41%。 不能将所有责任归咎于员工&#xff0c;因为薄弱的安全意识建设及宣教是大部分漏…

LeetCode 算法:对称二叉树 c++

原题链接&#x1f517;&#xff1a;对称二叉树 难度&#xff1a;简单⭐️ 题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;ro…

Windows C++ 应用软件开发从入门到精通详解

目录 1、引言 2、IDE 开发环境介绍 2.1、Visual Studio 2.2、Qt Creator 3、 C语言特性 3.1、熟悉泛型编程 3.2、了解C/C异常处理 3.3、熟练使用STL容器 3.4、熟悉C11新特性 4、Windows 平台的编程技术与调试技能 4.1、需要掌握的若干编程技术和基础知识 4.2、需…

37. 变焦镜头

导论&#xff1a; 设计好的一组镜头如果变化镜片与镜片之间的空气厚度&#xff0c;镜头的焦距会随之变化。 通常来说一个系统的接收面尺寸大小是固定不变的。 设计要求&#xff1a; 设计一个简单的变焦镜头&#xff1a;入瞳直径25mm&#xff0c;焦距75~125mm&#xff0c;像…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

三人同行乐享模式:社交电商的新趋势

在数字化时代&#xff0c;社交电商正以其独特的优势崭露头角。其中&#xff0c;“三人同行乐享模式”就是一种创新的购物激励机制&#xff0c;它通过消费者的社交互动和分享&#xff0c;不仅促进了产品的销售&#xff0c;更加强了品牌的推广和影响力。 一、模式简介 此模式的核…

java基于ssm+jsp 人才公寓管理系统

1管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码进行登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入人才公寓管理系统可以查看个人中心、住户管理、小区公告管理、停车位管理、安保人员管理、安保值班管理、房屋信息管理、外来登记管理、物品…

vscode使用内置插件断点调试vue2项目

1、首先项目中要开启source-map 在vue.config.js 文件中 module.exports {configureWebpack: {devtool: process.env.NODE_ENV ! "production" ? "source-map" : ,} }2、项目根目录新建.vscode/launch.js文件 {"configurations": [{"ty…

【C++庖丁解牛】函数栈帧的创建与销毁

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 寄存器2. ebp和esp是如…

win10系统管理员账号怎么切换

1、按住“windowsx”&#xff0c;选择“计算机管理” 2、在页面左侧&#xff0c;找到“计算机管理(本地)”&#xff0c;展开“系统工具”&#xff0c;点击“本地用户和组”下面的“用户”&#xff0c;在右侧找到“Administrator”&#xff0c;双击打开。 3、在打开页面选择常规…