改写socket编程并解释socket通信原理

news/2025/2/21 13:49:18/文章来源:https://www.cnblogs.com/kkbest/p/18348266

如果你仔细看我之前的博客,会看到那个手机打电话的示例,但是那段代码彻底写死了,真正编程的时候一定要写活了,不信你看看很多的程序的配置文件就是这样的,为什么单独分离个配置文件出来,就是为了便于修改配置,这就是把程序写活的最好的例子。

言归正传,直接上代码。

服务端:
from socket import *
ip_port=('127.0.0.1',8080)
backlog=5
buffer_size=1024tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(backlog)
conn,addr=tcp_server.accept()
data=conn.recv(buffer_size)
print('客户端发来的消息是:',data.decode('utf-8'))
conn.send(data.upper())
conn.close()
tcp_server.close()
输出结果:
客户端发送的消息是: hello客户端:
from socket import *
ip_port=('127.0.0.1',8080)
msg='hello'
buffer_size=1024tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port)
tcp_client.send(msg.encode('utf-8'))
data=tcp_client.recv(buffer_size)
print('服务端发来的消息是:',data.decode('utf-8'))
tcp_client.close()
输出结果:
服务端发来的消息是: HELLO其中,
from socket import *
ip_port=('127.0.0.1',8080)
backlog=5
buffer_size=1024
这一段可以单独提出来放到另外一个配置文件中。

上面这段代码还是不够好,你想一想,难道服务端和客户端之间就通信一次就结束了吗?显示是不对的,那么应该写个循环,改下代码如下:

服务端:
from socket import *
ip_port=('127.0.0.1',8080)
backlog=5
buffer_size=1024tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(backlog)
conn,addr=tcp_server.accept()
while True:data=conn.recv(buffer_size)print('客户端发来的消息是:',data.decode('utf-8'))conn.send(data.upper())
conn.close()
tcp_server.close()客户端:
from socket import *
ip_port=('127.0.0.1',8080)
buffer_size=1024tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port)
while True:msg=input('你要发送给服务端的内容是:')tcp_client.send(msg.encode('utf-8'))data=tcp_client.recv(buffer_size)print('服务端发来的消息是:',data.decode('utf-8'))
tcp_client.close()

上面这段代码如果客户端发送一个空(直接回车),就会导致客户端和服务端都卡住,你可知道是为什么?按道理说不应该是客户端发送什么,服务端就会收到什么吗?其实不是这样的,下面我就来讲一下这个客户端和服务端通信的原理:

如上图所示,
其实计算机主要的组件可以分为三层,最上层是应用软件,中间层是OS也就是操作系统,最底层是硬件(如网卡等硬件)。
从上图可以看出服务端和客户端之间的传输并非是直接就传过去了,启动一个应用程序,实际上是把该应用程序加载到内存中然后才启动的。内存分为用户态内存和内核态内存。应用程序启动时被加载到了用户态内存中,所谓内核态内存就是操作系统运行所在的内存区域。
下面我们来分析,为什么在发送空的时候,客户端和服务端会卡住,实际步骤如下:

1> 客户端向服务端发送一个空请求,该请求会从用户态内存发送到客户端自身的内核态内存(涉及到一系列封包操作,最后发出去的只能是字节形式)
注意: 正常非空请求会从内核态内存发送到服务端,之后到达服务端的内核态内存中,最后socket服务端程序再从内存中把消息取出来。
2> 因为是空请求,客户端内核态内存中的消息并不会被传输到服务端,也就意味着服务端的内核态内存中啥也没有。
3> socket服务端应用程序从用户态内存读取内核态内存里的消息,此时显示是读不到的,因为压根就没有,所以就一直处于等待状态。
4> 因为服务端没有收到消息,自然也没办法给客户端返回消息,所以客户端也会一直处于等待状态,从来两边都是卡死状态了。

以上就是客户端和服务端之间通信的真正原理,搞明白这个很重要,这就是我一直强调的对待知识一定要知其然且知其所以然。
继续借此平台阐发我的哲学思想,学习任何知识其实是有方法的,简而化之就是三步:
第一步:输入知识
第二步:理解消化
第三步:灵活运用
记住我的话,读书是学习,看视频课程是学习,生活处处是学习,但还有个最重要的学习叫做运用。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程项目综合管理系统解析:哪一款适合你的企业?

国内外主流的10款工程项目综合管理系统对比:PingCode、Worktile、广联达、明源云、中望软件、Oracle Primavera、Asana、Wrike、Zoho Projects、Basecamp。在处理复杂的工程项目时,选择合适的综合管理系统可能是一个令人头痛的问题。项目延误、成本超支和资源管理不当等问题常…

预训练语言模型去偏方法——与特定任务相关

一、对抗学习 1.1 ADV-标准对抗  主要思想:防止鉴别器识别受保护的属性。以对抗性方法训练模型,并明确掩盖受保护信息。 损失函数:1.2 EADV-优化对抗ADV存在的问题:在某些情况下,即使对抗性组件似乎做得很完美,仍有相当数量的受保护信息,并且可以从编码的表示中提取。…

使用wx制作一个桌面软件

前面因为抓取数据,为了方便期间做了各界面,用到了wx,觉得很好用,所以最近几天专门看了一下wx的使用,并练习了一下。 代码:import os,sys,re,time import wx,wx.xrc,wx.adv,wx.grid import json,math,random import subprocess,threading from win32api import GetSystemM…

来了它来了! 中小企业“轻量化低成本”数字化转型解决方案

数字化转型是中小企业的必答题,但是初始需要投入真金白银,存在回报期长,不确定性大的问题,成本受限成为一大绊脚石。此外缺资金、缺人才、缺技术也是不可回避的挑战。找集成商无疑是一个必然的路径,但是集成商干起中小企业项目面临钱少、活多、压力大的现实问题,陷入不接…

keycloak~关于社区登录的过程说明

keycloak将第三方登录(社区登录)进行了封装,大体主要会经历以下三个过程:打开社区认证页面,输入账号密码或者扫码,完成社区上的认证 由社区进行302重定向,回到keycloak页面 keycloak与社区完成一次oauth2授权码认证,通过社区返回的code来获取token,再通过token来获取社…

免费项目管理软件:提高效率的顶级选择

国内外主流的10款免费项目管理工具对比:PingCode、Worktile、Jira 、Wrike 、ClickUp、Trello、Asana、飞书、Tapd、Teambition。在选择项目管理软件时,许多团队面临的最大挑战之一是成本。尤其是对于初创公司或小型企业来说,高昂的软件订阅费可能是一个沉重的负担。然而,市…

表达式(二)

后缀表达式由于其特殊性只需要操作数栈,不需要运算符栈,每当出现运算符就说明是对前面两个操作数进行操作 #include<bits/stdc++.h> using namespace std; char tok[30][20]; int tok_max; int pos=1;int main(){tok_max=0;int num1=0;for(;;){int c=getchar();if(c==@…

基于深度学习网络的人员行为视频检测系统matlab仿真,带GUI界面

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 2.算法涉及理论知识概要基于GoogLeNet深度学习网络的人员行为视频检测系统是一个高度复杂的计算机视觉应用,它利用深度神经网络的强大功能来识别和分类视频中的人员行为。GoogLeNet,也称为Inception网络,…

Forrester Wave™报告:天翼云三项产品能力获评最高分!

8月5日,国际权威研究机构Forrester发布了《Forrester Wave™: 中国公有云平台厂商评测,2024Q3》报告。中国电信天翼云凭借前瞻性的发展战略和领先的产品能力,跻身行业头部玩家阵营。同时,中国电信天翼云在数据治理服务、网络和内容交付服务、先进通讯和区块链服务三项产品能…

从理念到实践,解构HBlock降本增效黑科技!

天翼云存储资源盘活系统HBlock 2024年线上技术分享会来啦!“新存储 更轻量” 天翼云存储资源盘活系统HBlock 2024年线上技术分享会来啦! 在2023年HBlock分享会之后 不少小伙伴积极参与了1PB免费尝鲜活动 好评如潮的同时也对HBlock有了更多期待! 那么 2024年轻量存储技术有哪…

21.python函数(return)

return 一、return语句 1、return是指定一个返回值 2、在python中创建一个函数 ,可以用return语句指定返回的的值,这个返回值可以是任意的类型 3、return语句在同一个函数中可以出现多次,但是只有有一个得到执行,就会直接结束函数的执行。return后面的语句不执行了 4、retu…