从使用Python开发一个Socket示例说到开发者的思维和习惯问题

简介:

今天主要说的是一个开发者的思维和习惯问题。

思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具。

无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的。那些不好的习惯,久了确实不好改。所以说,如果今天你认识到了,那么就从今天开始改,早改早受益,晚改痛苦一生。

先说一下今天的引子,那就是使用Python开发一个简单的Socket应用,就是一个client/server通信的小例子。

假设现在需要我们使用python开发一个socket的聊天应用,可能会遇到下面的问题。

  • python没有用过,怎么办呢?
  • 我用过python,可是我们开发过socket方面的应用?
  • 我还不知道socket是什么东西呢?
  • socket大概我记得,套接字吗,ip+port,具体的tcp和udp我不不太清楚。

其实我们几乎每天都可能会解决一些我们没有解决过的问题,有可能是没有用过的类库,没有听过的技术,没有用过的语言,甚至是没有听过的概念。

其实,这些都不是问题。只要你有一个较好的思维习惯,较好的思维方式,较好的解决问题的方法,那你就什么都不用怕了。

大家可以仔细的看看和研究一下,其实这10年20年,没有出现任何新的技术,出现的都是新的概念,所谓的新技术都是对老技术的挖掘,重新组合,应用到新的领域,用新的视角解决新的问题,其实用到的根本还是那些技术的技术知识。

这些技术知识包括:

  1. 语言的语法,语言的基本结构(顺序,选择,循环)。
  2. 技术的基础理论,例如,数据库理论,文件系统理论,今天我们演示用的socket通信理论。

当然了,除了上面的硬技术,你还需要一些软技术。例如,思考方法,好的习惯,好的工具,好的沟通,好的理解力,好的领悟力。

现在出现的东西都是上面这些东西的组合,或者将这些组合解决了新出现的问题,又或者是变了一种思路来解决老问题,等等诸如此类的组合。

举个例子来说吧。“云计算”,很火吧,各种语言的云计算,各种框架的云计算,但是如果你陷入这些语言和框架,结果可想而知,精力被耗尽,但是不见得真正理解多少,甚至是框架都会不完,因为太多了。

这就需要我们加强理论基础知识,云的理论基础就是分布式,分布式出来很多年了吧。好了,先学习和理解分布式,理解云就迎刃而解了。分布式+调度+服务器集群+通信=云,你看看,哪个是新的,哪个是以前没有的,对不对呢!

 

就拿socket举例子吧。只举个小例子,就是分别用tcp和udp实现聊天。

我们先不要google找python socket代码。我们先回忆一下我们学过的socket通信部分,或者说先找一本socket通信的书或者文章,看看通信的原理和过程。当然,不是要你通篇看完,通篇理解,完全弄懂。tcp和udp里面的细节你可能不知道,没有关系,如果需要的话,后面再来看。但至少你可以使用伪代码描述tcp和udp的通信流程,或者在纸上可以画出通信流程,使用流程图描述你要实现的功能。

别小看伪代码和流程图这两个简单的东西,它代表了你的思考过程,你的思维方法,和你选择的思维工具,是良好习惯的开端,一定要坚持,直到这些都成为你的习惯。

有了这些东西,别人会对你高看一眼的,会觉得你比较靠谱,就会给你更有挑战的工作,给你表现的机会,那么你就。。。。。。。。。。。。。。大家都明白的。你的各种想法都有机会实现了,否则就都是空白。

 

图1 tcp通信图

 

上图是一张socket的tcp通信简图,我们都知道tcp的通信需要三次握手。tcp是可靠的、面向连接的、尽力传输的协议,而udp是不可靠的、面向非连接的、不尽力传输的协议。但是不可靠不代表它没有用,udp有自己的应用场景,语音和视频几乎都在使用udp协议,它的不可靠只是相对于tcp来说的,但是它的好处就是效率,高效在某些场景要比可靠性重要。这就涉及trade-off了,也就是权衡,需要根据你的应用权衡利弊,然后进行选择。

在socket选择初始化一个tcp协议的socket之后,就会绑定一个地址和端口,然后开始listen,客户端连接这个listen的tcp之后,服务端会accept这个请求,然后产生一个新的socket,双方使用这个新的socket(地址和端口,地址还是上面listen的地址,端口会是一个新的,这个从打印出的结果中可以看出)进行后续的通信。原来的端口会继续的listen新的请求。

 

下面是tcpServer的代码

 


 
 
  1. import socket 
  2.  
  3. HOST='192.168.0.37' 
  4. PORT=50000 
  5. BUFFER=4096 
  6. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
  7. sock.bind((HOST,PORT)) 
  8. sock.listen(0
  9. print('tcpServer listen at: %s:%s\n\r' %(HOST,PORT)) 
  10. while True
  11.   client_sock,client_addr=sock.accept() 
  12.   print('%s:%s connect' %client_addr) 
  13.   while True
  14.     recv=client_sock.recv(BUFFER
  15.     if not recv: 
  16.       client_sock.close() 
  17.       break 
  18.     print('[Client %s:%s said]:%s' % (client_addr[0],client_addr[1],recv)) 
  19.     client_sock.send('tcpServer has received your message'
  20. sock.close() 

socket.SOCK_STREAM是用来指定socket是基于tcp协议的。

下面是对应的客户端代码

 


 
 
  1. import socket 
  2.  
  3. HOST='192.168.0.37' 
  4. PORT=50000
  5. BUFFER=4096 
  6.  
  7. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
  8. sock.connect((HOST,PORT)) 
  9. sock.send('hello, tcpServer!'
  10. recv=sock.recv(BUFFER) 
  11. print('[tcpServer said]: %s' % recv) 
  12. sock.close() 

 

下面是udpServer的代码

 


 
 
  1. import socket 
  2.  
  3. HOST='192.168.0.37' 
  4. PORT=50001
  5. BUFFER=4096 
  6. sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
  7. sock.bind((HOST,PORT)) 
  8. #sock.listen(0) 
  9. print('tcpServer listen at: %s:%s\n\r' %(HOST,PORT)) 
  10. while True
  11.   #client_sock,client_addr=sock.accept() 
  12.   #print('%s:%s connect' %client_addr) 
  13.   while True
  14.     recv,client_addr=sock.recvfrom(BUFFER) 
  15.     if not recv: 
  16.        
  17.       break 
  18.     print('[Client %s:%s said]:%s' % (client_addr[0],client_addr[1],recv)) 
  19.     sock.sendto('tcpServer has received your message',client_addr) 
  20. sock.close() 

你会发现由于udp是非连接的,不需要三次握手,所以不需要进行listen,也不需要accept,直接通信就可以了。还有就是初始化socket的时候,通过指定


 
 
  1. socket.SOCK_DGRAM 

来实现初始化的socket是基于udp协议的。

如果初始化的是udp协议的socket,就不需要listen,也不存在accept,双方通信的同时指明对方的地址和端口就可以了。

对应的客户端代码:

 


 
 
  1. #!/usr/bin/env python 
  2. # -*- coding: UTF-8 -*- 
  3.  
  4. import socket 
  5.  
  6. HOST='192.168.0.37' 
  7. PORT=50001 
  8. BUFFER=4096 
  9.  
  10. sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
  11. sock.connect((HOST,PORT)) 
  12. sock.send('hello, tcpServer!'
  13. recv=sock.recv(BUFFER) 
  14. print('[tcpServer said]: %s' % recv) 
  15. sock.close() 
  16.  

 

说了上面这么多,我的主要意思就是。开发者要加强理论基础的学习,不要穷追猛打那些语言和框架,至少在穷追猛打的过程中,分出更多的精力关注基础知识,基础牢靠,上层建筑才稳固且长久。

对于少数人,这已经形成他们的习惯了,他们已经及早的认识到了这个问题,这么多年都是这么做的。

对于大多数开发者来说,都是遇到问题,找语法,找例子,拔过来,改一改,debug,看效果,再debug,再看效果。问题可能解决了,但是过程是痛苦至极,年前的时候还不觉得如何,时间一长,发现开发原来是这么的没有意思,这么的枯燥,每天都是这个过程,没有新意,这么多语言框架,什么时候才能学完呢,感觉自己被拉着走,甚至是拖着走,没有解脱的一天,除非dead。

不过也没有关系,大多数人都是这么过来的,那些牛人也是这么过来的,只是他们很早就意识到了这个问题,然后及早的修正,及早的进入一条快车道。就像我一直说的,开发者的几个阶段是不能越过的,但是你可以比别人多花时间和精力,缩短这些必经阶段的时间,这个很重要的。

如果你今天认识到了,那么不要拖到明天,不要拖到下个项目,不要拖到下一个模块,从现在开始,从这个项目开始,从这个模块开始,修正自己,后面的路就会舒服很多。我不能保证后面你会如何如何,但是敢保证你会越来越舒服,就算是一直coding到退休,也不是在痛苦中coding,而是舒舒服服的coding。没有人会对我们说“你30岁了,还在coding。。。。。。”,因为我们coding的过程,我们coding出来的结果配得上我们的年龄了。




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/800209,如需转载请自行联系原作者

目录
相关文章
|
3天前
|
人工智能 自然语言处理 程序员
用通义灵码开发一个Python时钟:手把手体验AI程序员加持下的智能编码
通义灵码是基于通义大模型的AI研发辅助工具,提供代码智能生成、研发问答、多文件修改等功能,帮助开发者提高编码效率。本文通过手把手教程,使用通义灵码开发一个简单的Python时钟程序,展示其高效、智能的编码体验。从环境准备到代码优化,通义灵码显著降低了开发门槛,提升了开发效率,适合新手和资深开发者。最终,你将体验到AI加持下的便捷与强大功能。
|
7天前
|
JSON 监控 API
python语言采集淘宝商品详情数据,json数据示例返回
通过淘宝开放平台的API接口,开发者可以轻松获取商品详情数据,并利用这些数据进行商品分析、价格监控、库存管理等操作。本文提供的示例代码和JSON数据解析方法,可以帮助您快速上手淘宝商品数据的采集与处理。
|
13天前
|
存储 API 数据安全/隐私保护
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
51 6
|
13天前
|
Go Python
Python中的round函数详解及使用示例
`round()`函数是Python内置的用于四舍五入数字的工具。它接受一个数字(必需)和可选的小数位数参数,返回最接近的整数或指定精度的浮点数。本文详细介绍其用法、参数及示例,涵盖基本操作、负数处理、特殊情况及应用建议,帮助你更好地理解和运用该函数。
|
20天前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
206 9
|
21天前
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
137 82
|
24天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
51 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
24天前
|
人工智能 测试技术 数据处理
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
121 11
|
1月前
|
API Python
python泛微e9接口开发
通过POST请求向指定IP的API注册设备以获取`secrit`和`spk`。请求需包含`appid`、`loginid`、`pwd`等头信息。响应中包含状态码、消息及`secrit`(注意拼写)、`secret`和`spk`字段。示例代码使用`curl`命令发送请求,成功后返回相关信息。
44 5
|
2月前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
47 10

热门文章

最新文章

推荐镜像

更多