python网络编程学习《一》

最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以及护肤了,哈哈,程序员就是酱紫,身体是革命的本钱。现在的方向至少是确定了,数据分析,但是图像处理这个项目既然当初选择当负责人,现在也要负责啊;那么目前学习网络编程,也是因为学长希望在“wind”的登陆上面实现c/s架构,那么我就试试吧,说不定,自己在量化投资或者网络上面也是可以的捏。废话不说,进入学习状态。

  1. 什么是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()

分别运行客户端和服务端瞧瞧~

报错:

好吧,先挖一个坑在这里,后面再补上

posted @ 2015-11-19 10:28  wing1995  阅读(831)  评论(0编辑  收藏  举报