最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以及护肤了,哈哈,程序员就是酱紫,身体是革命的本钱。现在的方向至少是确定了,数据分析,但是图像处理这个项目既然当初选择当负责人,现在也要负责啊;那么目前学习网络编程,也是因为学长希望在“wind”的登陆上面实现c/s架构,那么我就试试吧,说不定,自己在量化投资或者网络上面也是可以的捏。废话不说,进入学习状态。
- 什么是c/s架构?
‘c’就是'client','s'就是'server',那么初步理解就是实现服务器与客户端之间的通信,那么我学习的目的就是实现万得数据库上面的多方登陆,也就是说在服务器上登录了,在多个客户端可以实现交易操作,前提是只要在局域网内访问一下服务器的地址即可。
2. 什么是套接字?
举个例子,如果说万得金融数据平台是我要访问的一家公司“万得”,那么我现在要打电话,请求该公司的数据什么的;这个时候,服务器就是该公司的接线员,众多个电话就是客户端了,我可以通过多个电话访问该公司的号码以及端口来跟公司取得联系,这个时候电话的“插口”就是“套接字”,套接字有两种,一种是基于文件型的,一种是基于网络型的;其中,当两个进程都运行在同一台电脑,这个时候这两个进程之间的通信之间的套接字就是基于文件型;那么,我们研究的网络编程当然就是基于网络型的啦,家族名字为“AF_INET”,全称是“地址家族:Internet”,可想而知,套接字地址就是由“主机”和“端口”组成,通信的前提是,你的电话号码和区号都对了,并且对方公司有人时刻准备接听电话,也就是说,你得跟对方之间有一个通信口:对的地址和相同的端口号;以及对方随时的“listen”。
这里,主机地址不用说了,那么端口号一般是人为给定的,合法的端口号范围是0-65535。其中,小于1024的端口号为系统保留端口,linux系统上可以通过查看文件“/etc/services”查看保留的端口号以及对应的服务和套接字类型。
3. 什么是面向连接?
好了,现在你有了电话,有了接线员,有了插口,就缺一根电话线了,更准确的说是连接你的电话与公司电话之间的线路,就是一个面向连接。面向连接提供了顺序的、可靠的、不会重复的数据传输,没有数据边界,意味着数据会被拆成多份,每一份数据都会正确送达目的地,然后按照顺序拼接起来发给对方接线员。这里实现面向连接的主要协议就是传输控制协议(TCP)。创建TCP套接字的时候需要在创建的时候指定套接字类型为“SOCK_STREAM”,字面意思就是套接字流。
讲了这么多,主要围绕“套接字”,在python中主要使用socket模块实现网络通信,其中函数socket()就是用来创建套接字。关于socket函数的参数以及例子可以通过在交互平台输入“help(socket.socket)”实现,前提是要“import socket”哈~
很明显,socket()有三个参数,分别是family,type以及protol,那么family当然一般是“AF_INET”啦,type就是“SOCK_STREAM”,protol一般默认值为0,不用填写,好了其他的函数在该文档也有详细介绍,例如accept以及bind什么的,大家那么从聪明,这点英文还是看得懂滴,废话不说, 上几个例子,来源于http://defshine.github.io/python-source-learn01.html。
- 最简单的socket通信
server_1.py
1 # coding=utf-8 2 __author__ = 'wing1995' 3 import socket 4 5 # 设置本机地址以及通信端口号,缓存空间为1024 6 HOST = '127.0.0.1' 7 PORT = 8888 8 ADDR = (HOST, PORT) 9 BUF_SIZE = 1024 10 11 # 生成套接字,绑定套接字地址并开始TCP监听 12 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 server.bind(ADDR) 14 server.listen(1) 15 16 # 被动的等待连接以及接受的地址,等待客户端发送数据,如果没有数据就退出循环并关闭连接退出服务器,反之数据接收成功 17 conn, addr = server.accept() 18 print("server connected by:", addr) 19 while 1: 20 data = conn.recv(BUF_SIZE) 21 if not data: 22 break 23 print("server recv success") 24 conn.close()
client_1.py
1 # coding=utf-8 2 __author__ = 'wing1995' 3 import socket 4 5 # 服务器的主机名和通信的端口号 6 HOST = '127.0.0.1' 7 PORT = 8888 8 9 ADDR = (HOST, PORT) 10 BUF_SIZE = 1024 11 12 # 类似服务器,不同的是多了发送数据以及接受数据 13 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 14 client.connect(ADDR) 15 client.send('client say:hello, my name is wing!') 16 data = client.recv(BUF_SIZE) 17 if data: 18 print("client recv----", data) 19 client.close()
分别运行客户端和服务端瞧瞧~
报错:
好吧,先挖一个坑在这里,后面再补上