初学电脑编程需要啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学电脑编程需要啥相关的知识,希望对你有一定的参考价值。
我想学电脑编程,之前对电脑的了解也就停留在游戏阶段,最近对电脑编程产生了兴趣,想自学,请问需要哪些书和软件,应该怎样学,学的过程中需要注意什么,我现在先入门,希望高手指教
初学电脑编程需要学习英语,选择一门编程语言,要有数学基础,具体介绍如下:
1、英语基础
计算机英语与传统的英语知识不同,需要了解的大部分是计算机的专业单词或者词汇,普遍较为简单。但是在高级编程中,会出现比较生涩的词汇,对于想要参与计算机语言设计以及在职业发展上有更多追求的同学可以自学一下大学英语。
2、选择一门编程语言
选择一门编程语言。虽然目前编程语言有600种左右,但是比较流行的编程语言只有几十种,所以尽量选择流行程度比较高的编程语言来入门编程。对于没有明确编程场景的初学者来说,尽量选择全场景编程语言,比如Java、Python、C#等就是不错的选择
3、数学基础
当然拥有初中阶段的数学基础也可以成为一名合格的程序员,这也是目前很多计算机编程培训学校招收初中毕业学生的原因。但想要成为一名优秀的程序员,最少要高中及以上的数学基础,而且要懂得如何举一反三,灵活运用。
4、了解计算机操作系统原理
所有的开发或者说软件应用都是在特定的操作系统上进行的,所以计算机操作系统原理可以说是基础中的基础是必须要了解的。
5、数据结构和算法
这门课程能够决定一个人程序设计水平的高低,是学习过程中需要重点掌握的。C和C++都是可以选择的,前期可以先学C,再学C++会相对简单一些。
在学习编程语言的过程中,也需要同时学习计算机网络、数据库等相关知识,在当前的云计算和大数据时代背景下,还需要掌握如何通过云计算(PaaS)来辅助开发,以及如何利用大数据平台的各种资源。
参考技术A 下面是我个人的一些见解,希望对楼主有所帮助~~ 学习编程,首先应该认认真真的学习一门语言。学习微软的,就先从VB开始,VB是比较好的入门语言,可视化的,比较简单,是非常好的入门语言。书籍最少应该准备两本,不可能一本书籍会包含VB的所有内容,在看书的时候,可以交叉的看,一本书籍中没有讲到的内容可以在另一本中看到,这样对学习是很有好处的,也能保证所学知识的完整性。学编程是一个很漫长的过程,不要着急,要理论与实践想结合,例程书籍也是很重要的,看源代码对学习也是很有帮助的,等你学完这门VB语言之后,学习别的语言是非常简单,可以尝试C语言,按照C——C++——VC的顺序学习,有助于知识的连贯性。或者学习Delphi,入门较为简单类似于VB,但比VB强大,即可作为入门又能做强、做大。 1 . 明确学习目的 学习编程对大多数IT业人员来说都是非常有用的。学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序员永远是被争夺的对象。学习编程还能锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿,因为程序设计本身是一种创造性的工作。知识经济时代给我们带来了无限的机会,要想真正掌握计算机技术,并在IT行业里干出一番事业来,有所作为,具有一定的编程能力是一个基本条件和要求。 2 . 打好基础 学编程要具备一定的基础,总结之有以下几方面: (1)数学基础——从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了。 (2)逻辑思维能力的培养——学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。谁都有第一次。有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。 (3)选择一种合适的入门语言——面对各种各样的语言,应按什么样的顺序学呢?程序设计工具不外乎如下几类: ① 本地开发应用软件开发的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;数据库开发工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 ② 跨平台开发开发工具如 Java 等。 3)网络开发对客户端开发工具如:Java Script 等;对服务器开发工具如:php 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的环境下几种开发工具中 VB 法简单并容易理解,界面设计是可设化的,易学、易用。选 VB 作为入门的方向对出学者是较为适合的。 3 . 注意理解一些重要概念 一本程序设计的书看到的无非就是变量、函数、条件语句、循环语句等概念,但要真正能进行编程应用,需要深入理解这些概念,在理解的基础上应用,不要只简单地学习语法、结构,而要吃透针对这些语法、结构的应用例子,做到举一反三,触类旁通。 4 . 掌握编程思想 学习一门语言或开发工具,语法结构、功能调用是次要的,最主要是学习它的思想。例如学习VC就要学习Windows的内在机理、什么是线程......;学习COM就要知道VTALBE、类厂、接口......,关键是学一种思想,有了思想,那么我们就可以触类旁通。 5 . 多实践、多交流 掌握编程思想必须在编程实际工作中去实践和体会。编程起步阶段要经常自己动手设计程序,具体设计时不要拘泥于固定的思维方式,遇到问题要多想几种解决的方案。这就要多交流,各人的思维方式不同、角度各异,各有高招,通过交流可不断吸收别人的长处,丰富编程实践,帮助自己提高水平。亲自动手进行程序设计是创造性思维应用的体现,也是培养逻辑思维的好方法。 6 . 养成良好的编程习惯 编程入门不难,但入门后不断学习是十分重要的,相对来说较为漫长。在此期间要注意养成一些良好的编程习惯。编程风格的好坏很大程度影响程序质量。良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护。如代码的缩进编排、变量命令规则的一致性、代码的注释等。 7 . 上网学编程 在网上可以学到很多不同的编程思想、方法、经验和技巧,有大量的工具和作品及相关的辅导材料供下载。例如网站“编程课堂”( http://best.yeah.net/) 主要以 VB 和 Delph;教学和交流为主,提供大量实用技巧;网站“现在时编程学园”( http://pshool.yeah.net/) 是专门介绍C、VC、VB、Delphi 等的综合编程网站;网站“ VB 编程乐园 ”( http://www.vbeden.com/) 提供内容丰富而且实用的编程技术文章、精选控件、源代码下载、计算机考试、相关软件以及编程书籍推荐等等。 8 . 加强计算机理论知识的再学习 学编程是符合“理论→实践→再理论→再实践”的一个认识过程。一开始要具有一定的计算机理论基础知识,包括编程所需的数学基础知识,具备了入门的条件,就可以开始编程的实践,从实践中可以发现问题需要加强计算机理论知识的再学习。程序人人皆可编,但当你发现编到一定程度很难再提高的时候,就要回头来学习一些计算机科学和数学基础理论。学过之后,很多以前遇到的问题都会迎刃而解,使人有豁然开朗之感。因此在学习编程的过程中要不断地针对应用中的困惑和问题深入学习数据结构、算法、计算机原理、编译原理、操作系统原理、软件工程等计算机科学的理论基础和数理逻辑、代数系统、图论、离散数学等数学理论基础知识。这样经过不断的学习,再努力地实践,编程水平一定会不断提高到一个新高度。 学习编程是一件好事 不过之前你得先了解,你学习编程的目的是什么,这个很重要,因为目的决定发展方向。 目前对于编程有很多种编程语言以及相对应的开发软件,下面说明一些常用的编程语言,根据你的情况选一种语言进行学习,不要盲乱学习。 C语言:一种可移植性和多系统平台的编程语言,开发软件,如:TC。 VB:一种可以说是既学既用的软件开发语言,开发软件如:VB 6.0。 DELPHI:一种和VB差不多的既学既用的软件开发语言不过其功能远比,VB强大,代码书写上更加方便,开发软件,如:DELPHI 7.0。 JAVA:一种功能强大可移植性强开发语言。 程序语言,顾名思义就是语言,是用于交流的,程序就是计算机的语言和人的语言的翻译者,做一个程序员就是要把人类世界的问题用计算机的方法去解决和展现,可是因为种种原因,大多数人在如何学好语言,如何学好开发平台上疲于奔命,到头来你只会敲写代码。 程序基本上都是自学的,买书是一开始碰到的最头痛的问题,计算机的书大多都很贵,现将我的一点经验供大家参考: 如果想做一个合格的程序员,C++是一定要学的, 首先你要花两个月的时间学习C、C++,这样的书很多,去选一些大学的教材足亦,切记,不要花过多的时间研究C++,两个月够了,只要学会其中语法就行了,不要为了深入用DOS编写菜单什么的,那是吃饱人参了。 如果你有过多的时间,接下来你可以学习数据结构,推崇《数据结构C++语言描述》,清华大学出版,但如果无过多时间,还是不看为妙,至少我现在从未用过这本书的知识,许多东西MFC VCL等开发平台都为你已经做好。 接下来开始学习Windows下的SDK编程, 推崇《Windows程序设计》,建议去借,不要买,而且你只看上册,你只要了解Windows的运作机制即可。两个月后,你将转入VC的世界,既然要在Windows下编程,VC不可不学, 推崇《VC++技术内幕》第四版,三个月,不要全部看,看前面的三部分,后面不要看。后面的只是对COM,数据库,Internet形如鸡肋的介绍。 接下来你应该考虑一下你将要发展的方向,如果是做数据库,你可以用VB和Delphi或CB,如果要做通信方面,或者硬件,你将要深入VC,如果是WEB相关的,去学学ASP、JAVA、JSP、XML等,但有一样你必须要学的,COM。COM与其说是一样新的技术,还不如说是种机制,推崇潘爱民的《COM原理和应用》,你可以一边看这本书,一边学习些ActiveX组件,ATL控件等等。如果你有的是时间,不急于找工作,你还可以看看《Windows高级编程》或《Windows核心编程》,但不管怎么样,你要切记,VC不是用来做界面和数据库的,做网络的现在也有JAVA,都是用来做一些很底层的东西,VC是很高薪的,如果你对自己有充分的信心和有的是时间,你才可以深入VC。否则的话,还是看看人才市场,看看行情,再说。 还有一点切记,有些书,诸如《MFC深入浅出》这些书主要是关于那些技术原理的介绍,我个人认为程序只是工具,只是技术,只要学会用,能完成任务即可,如果有的是时间,才会去探索根源,也许有许多人会说,懂了原理对你编程会有很大帮助,我不否认,但是,要知道,就算你编程技术如何了得,你只是个技术人员,当你学了那么多的技术和知识,第一,计算机的知识其实是各大公司制定出的标准,标准变了,你不是白学了吗?第二,当你花了几年的时间学习,到头来你只不过程序水平提高一点。我认为应当将你的大部分智力和精力用在如何与人打交道,电脑让你用的好有什么用,人脑让你摆弄的好才算真本事,就如《黑冰》里面的计算机工程师,虽然对计算机十分精通,可有什么用,还不是死在王志文的手里?而且死的很惨,脸都毁了 另外不要去学你喜欢的,也不要去费劲脑子想该学什么,看看人才市场,市场需要什么,你学什么。本回答被提问者和网友采纳 参考技术B 回答学习编程最好准备笔记本电脑,因为笔记本电脑方便携带,去听课程之类的比较方便,或者去安静的地方学习也比较方便。甚至后面去面试可以带去展示自己的项目。
学习编程需要准备内存卡比较大的笔记本电脑,至少8GB及以上的内存,内存越大越好。因为跑项目的时候由于比较多数据会加载到内存里面,加上编程时需要打开很多工具占用的内存也会比较多,所以内存太小的笔记本电脑会跑不起项目报内存不足。
学习编程需要准备处理器比较高的电脑,最好是多核CORE i5以上的电脑,因为为编程需要处理的数据量比较多,打开的工具多进程也就比较多,跑项目时开启的线程也会比较对,这就对电脑的处理器要求比较高,处理器太低的电脑可能跑不动这些东西,甚至会加载项目很慢,打开工具也很慢,严重影响学习进度。
学习编程要求电脑的散热功能比较好,因为一天中电脑使用时间比较长,而且跑很多东西,电脑比较发热,散热功能不好的电脑容易蓝屏、黑屏,甚至烧毁处理器,因为最好准备散热功能比较好的电脑,可以考虑游戏笔记本电脑,这类电脑的散热功能做的都比较好。
亲亲,您好,以上为答案哦。
参考技术C学习编程,首先应该认认真真的学习一门语言。学习微软的,就先从VB开始,VB是比较好的入门语言,可视化的,比较简单,是非常好的入门语言。书籍最少应该准备两本,不可能一本书籍会包含VB的所有内容,在看书的时候,可以交叉的看,一本书籍中没有讲到的内容可以在另一本中看到,这样对学习是很有好处的,也能保证所学知识的完整性。
拓展:
1、编辑程序让电脑执行的过程就叫编程 很多软件都可以编程 具有代表性的计算机语言有BASIC C,C++,VB,VF,SQL,网页编程JSP,ASP,PHP ,软件是Microsoft Visual Studio,Microsoft Visual Basic,Microsoft SQL Server,等等。 BASIC是Beginner's All-purpose symbolic instruction Code(初学者通用符号指令代码)的缩写,是国际上广泛使用的一种计算机高级语言。BASIC简单、易学,目前仍是计算机入门的主要学习语言之一。
2、编辑程序让电脑执行的过程就叫编程。很多软件都可以编程。具有代表性的计算机语言有BASIC,C,C++,VB,VF,SQL,网页编程有JSP,ASP,PHP,软件是Microsoft Visual Studio,Microsoft SQL Server,等等。BASIC是Beginner's All-purpose symbolic instruction Code(初学者通用符号指令代码)的缩写,是国际上广泛使用的一种计算机高级语言。BASIC简单、易学,是计算机入门的主要学习语言之一。
参考技术D1、重视计算机底层基础知识
掌握一种编程语言的熟练度,决定你多久能参加项目实践;理解把握计算机底层的深浅,决定你能在IT编程走多远。
C/C++,JAVA,PYTHON,javascript编程语言,其实本质都是一样的,正所谓一通百通,关键是基础架构的理解。2、培养持续的学习能力
即使还在学校,老师也只是天马行空,讲讲大概的学习方向。知识点的深入理解,扩充,代码实践,这些都只能靠自己。学校的基础理论是经得起考验的,但是,学校学的技术很多都只是能做练习的。真正实用的前沿技术,是在企业,是在技术论坛。
工作了以后,就更要自学了,程序员都很忙,80%的问题都可以在网上找到答案,别人也是这么走过来的。2018年10万专业程序员的问卷调查:绝大多数的程序技术员都是通过网络自学新技术的。
3、保持浓厚的兴趣
兴趣是程序员最完美的伴侣伴2018年10万专业程序员的问卷调查:80%的程序员把编程作为爱好。对编程没有兴趣,甚至反感的人来说,学习一门编程语言C已经很痛苦了,还有什么勇气持续深入的学习JAVA,PYTHON和各种新技术,兴趣是持续的兴趣,而不是三分钟热度。
初学Python——Socket网络编程
认识socket
socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。
建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。
基本参数
Socket Families(地址簇)
socket.
AF_UNIX 本机进程间通信
socket.
AF_INET IPV4(默认)
socket.
AF_INET6 IPV6
Socket Types(类型)
socket.
SOCK_STREAM 流式socket,代表TCP协议(默认)
socket.
SOCK_DGRAM 数据报式socket,代表UDP协议
socket方法
sk = socket.
socket
(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
建立socket连接对象
sk.bind(address)
s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。
sk.listen(backlog)
开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
这个值不能无限大,因为要在内核中维护连接队列
sk.setblocking(bool)
是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
sk.accept()
接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
接收TCP 客户的连接(阻塞式)等待连接的到来
sk.connect(address)
连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
sk.connect_ex(address)
同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061
sk.close()
关闭套接字
sk.recv(bufsize[,flag])
接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
sk.recvfrom(bufsize[.flag])
与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
sk.send(string[,flag])
将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。
sk.sendall(string[,flag])
将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
内部通过递归调用send,将所有内容发送出去。
服务端步骤:
步骤:
1.server = socket.socket() 声明实例,生成连接对象
2.server.bind() 绑定要监听的端口
3.server.listen() 开始监听
4.conn,addr = server.accept()等待客户端发起连接,阻塞
5.接收数据(发送数据)
6.当客户端断开连接后,继续监听等待下一个客户端建立连接
……
关闭连接对象
代码示例:
import socket "服务器端" server = socket.socket() # 生成连接对象 server.bind(("localhost",6000)) # 绑定要监听的端口 server.listen(5) # 开始监听(最大允许挂起的连接) while True: print(" 服务器在等待...") conn,addr = server.accept() # 等待客户端发起建立连接,起到阻塞作用 # conn 是客户端链接过来而在服务器端为其生成的连接实例,addr是IP地址+端口 print("已成功连接") print("连接对象:{0},地址:{1} ".format(conn,addr)) while True: try: data = conn.recv(1024) # 接收数据 # (如果客服端断开连接,此步骤将会被无限循环操作,所以一定要有检查机制) if data != b"000001": # 接收到的信号不是"000001"的话就正常执行 print("接收客户端信息:", data.decode()) msg = input(">>输入返回客户端的数据:") conn.send(msg.encode(encoding="utf-8")) # 向客户端发送数据 else: print("该客户已主动断开连接") break except ConnectionResetError as e: print("该客户机异常!已被强迫断开连接",e) break else: print("It‘s OK !") server.close()
客户端步骤:
步骤:
1.client = socket.socket() 声明实例,生成连接对象
2.client.connect() 与服务器建立连接
3.与服务器交互(发送接收数据)
4.client.close() 断开连接
代码示例:
import socket "通信案例客户端消息接收与发送" client = socket.socket() # 声明socket类型,并生成socket连接对象 try: client.connect(("localhost",6000)) # 与服务器建立连接 while True: msg = input(">>输入要向服务器发送的信息:") client.send(msg.encode(encoding="utf-8")) # 向服务器发送信息(只能发送bytes字节类型,不能是str字符类型) data = client.recv(1024) # 接收来自服务器的1024个字节 print("接收来自服务器的数据:",data.decode()) # 打印服务器发送的数据 chioce = input("按任意键继续,按0退出客户端") if chioce == "0": client.send(b"000001") # 发送此信号表明客户端要断开连接 break client.close() except ConnectionRefusedError as e: print("服务器还没开机!请静候")
需要注意的是:
1.客户端再发送数据时,要主要服务器接收的大小限制。如果超过了这个限制,超出的部分暂时存在系统缓冲区,第二次接收的时候再输出剩下的部分。例如服务器端的recv(1024),而客户端一次发了2024字节,那么剩下的1000字节存在缓冲区,第二次接收的时候会接收缓冲区的内容,将不会接收新发来的数据,会造成数据错误。官方建议一次性不超过8192字节
2.双发收发数据只能是bytes类型
3.粘包问题,下面讲
socket粘包问题
什么是粘包呢?我们知道发送数据,并且数据量比较大时,并不会一次性发送,即使能一次发送,客户端也不一定能一次性接收,所以服务器有个缓冲区,等客户端下次再接收数据的时候再发送给客户端,所以,就需要将数据分成几次发送,客户端分成几次接收。那又出来问题了,客户端知道数据(文件)有多大么?它怎么知道要接收几次?当然是要服务器告诉他啦!
于是,我们设计服务器首先发送数据大小(数据),再开始分批发送数据,客户端先接收文件大小(数据),再开始分批接收。问题就有可能在这里出现了。如果连续2次send数据,很有可能将两次的数据黏在一起发送出去,在客户端也无法将其分开,怎么办呢?
我们可以让服务器每次发送数据后,接收来自客户端的确认,这样会强制清空缓冲区,就不会造成粘包。当然,基于上面讲的方法,只需要在发送正式数据之前接收确认就好。
最后,如果希望100%确认双发收发数据是否一致,可以采用MD5校验。
服务器端步骤:
1.读取文件名
2.检测文件是否存在
3.打开文件
4.检测文件大小
5.将文件大小发给客户端
6.确认
7.开始边读边发(循环发送)
8.发送MD5
代码:
import socket,os,hashlib ser = socket.socket() ser.bind(("localhost",5000)) ser.listen() while True: try: print("正在等待客户端连接...") conn,addr = ser.accept() print("已连接,new conn:",addr) while True: data = conn.recv(8192) filename = data.decode() print("寻找文件",filename) if os.path.isfile(filename): conn.send(b"01") conn.recv(1024) f = open(filename,"rb") m = hashlib.md5() file_size = os.stat(filename).st_size conn.send(str(file_size).encode(encoding="utf-8")) client_ack = conn.recv(1024) # 接收确认信息 if client_ack == b"1": print("开始发送数据") for line in f: m.update(line) conn.send(line) f.close() conn.send(m.hexdigest().encode(encoding="utf-8")) # 发送MD5值 else: conn.send(b"00") #表示文件不存在 print("该文件不存在!") except ConnectionResetError: print("该客户端已断开连接") ser.close() print("服务器已关闭")
客户端步骤:
1.发送接收文件请求,同时将文件名发送给服务器
2.接收文件长度
3.本地新建同名文件,循环接收数据,并将其写入文件
4.同时更新本地MD5值
5.接收数据完毕后,再接收服务器的MD5值,与本地MD5值进行比较
代码:
import socket,hashlib def receive1(client): "真正的数据接收" while True: res = b"" res = res + client.recv(1024) return res def receive(client,filename): "接收处理" m = hashlib.md5() rece_res_size = int(client.recv(1024).decode()) # 接收的结果长度,转成int型 client.send(b"1") rece_size = 0 res = b"" filename = filename.decode() f = open(filename + ".new","wb") while rece_size < rece_res_size: if rece_res_size - rece_size >1024: # 如果不是最后一次接收数据 size = 1024 else: # 最后一次接收数据 size = rece_res_size - rece_size a = client.recv(size) # 循环接收数据 res = res + a rece_size = len(res) m.update(a) f.write(a) print("发送数据量:{0},接收数据量:{1}".format(rece_res_size,rece_size)) else: serves_md5 = client.recv(1024).decode() print("服务器MD5:",serves_md5) print("客户端MD5:",m.hexdigest()) if serves_md5 == m.hexdigest(): print("文件接收并校验完毕!") res.decode() f.close() def main(): client = socket.socket() try: client.connect(("localhost", 5000)) while True: filename = input("请输入需要的文件名").strip().encode(encoding="utf-8") if len(filename) == 0: print("输入为空,重新输入") continue client.send(filename) is_file = client.recv(1024) if is_file == b"01": client.send(b"OK") receive(client,filename) # 调用函数接收数据,返回结果res(bytes) else: print(" {0} 文件不存在!".format(filename.decode())) except ConnectionRefusedError: print("等待服务器开机") client.close() main()
socketserver
什么是socketserver?为什么需要它呢?
我们在前面的文章中普通的socket并不能同时处理多个客户端,当一个客户端在与服务器连接时,其它客户端只能排队。而sockerserver则不同,它可以并发地处理多个客户端请求。
import socketserver ‘‘‘ 每一个客户端请求过来,都会实例化 MyTCPHandler ‘‘‘ class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): "跟客户端所有的交互都是在handle里完成的" while True: try: self.data = self.request.recv(1024).strip() print("{0} wrote:".format(self.client_address[0])) print(self.data) if not self.data: print("输入为空") self.request.send(bytes("输入为空", "utf-8")) else: self.request.send(self.data.upper()) except ConnectionResetError : print("客户已断开连接") break if __name__ == "__main__": HOST, PORT = "localhost", 9999 #server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) # 实例化一对一的连接对象 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) # 实例化多并发的连接对象(多线程) server.serve_forever()
客户端并没有什么区别:
import socket HOST, PORT = "localhost", 9999 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) while True: data = input("输入字符") try: sock.sendall(bytes(data + " ", "utf-8")) received = str(sock.recv(1024), "utf-8") finally: print("Sent: {0}".format(data)) print("Received: {0}".format(received)) sock.close()
以上是关于初学电脑编程需要啥的主要内容,如果未能解决你的问题,请参考以下文章