Day-17: 网络编程

---恢复内容开始---

  现有的互联网通讯方式,是服务器端的进程与客户端进程的通信。Python中进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信。

  互联网协议上包含了上百种协议标准,但是,最重要的是两个协议:TCP和IP协议。所以,互联网协议简称TCP/IP协议。

  通信时必须知道双方的标识,而一台计算机可能同时接入多个网络,就会有两个或多个IP地址。所以,IP地址实际上对应的是计算机的网络接口,通常是指网卡。

  IP协议将数据分割成一小块一小块,然后通过IP包发送出去。特点:按块发送,不保证能到达,也不保证能顺序到达。

  TCP协议,建立在IP协议上,负责将两台计算机之间建立可靠连接,保证数据包按顺序到达。

特点:握手连接,对IP包编号,确保顺序收到,若掉包,则自动重发。

  一个IP包,包含传输数据,源IP地址和目标IP地址,源端口和目标端口。

  IP是标识在网络中的电脑的位置,而一台电脑上会有多个网络通信进程,所以端口则是标识目标进程在该电脑上的位置。

  • TCP编程

  首先要理解socket表示“打开一个网络链接”,而创建一个socket需要知道目标计算机中的ip,端口号,然后再指定所用的协议。

  客户端:主动发起链接的叫客户端。

# 导入socket库:
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))

  客户端导入socket库后首先创建socket网络链接,socket.AF_INET指定使用IPv4协议,socket.AF_INET6指定使用IPv6协议。SOCK_STREAM指定使用面向流的TCP协议。然后输入所需的ip和端口号,进行链接,注:其中域名会自动转换成ip。

  这里指的一提的是:网络服务小于1024的端口号都是Internet标准服务的端口,有固定的用处,大于1024的则可以任意使用。其中,80端口为网页服务端口,25为SMTP服务端口,FTP服务为21端口。

# 发送数据:
s.send('GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')

  然后以HTTP格式发送数据,发起请求。

  TCP协议只是建立了大致的双向通道,而至于怎么协调,得依据具体的协议来决定,如HTTP协议规定客户端必须先发起请求,服务端才能返回数据。

# 接收数据:
buffer = []
while True:# 每次最多接收1k字节:d = s.recv(1024)if d:buffer.append(d)else:break
data = ''.join(buffer)

  接受数据时,调用recv(max)方法,指定一次最多接受的字节数,因此,在一个while循环中反复接受,知道recv()返回空数据,表示接收完毕,退出循环。

# 关闭连接:
s.close()

  最后,调用close()方法关闭Socket,一次完整的网络通信就结束了。

  网络通讯结束后,就可以对接受到的数据进行相应的处理了:

header, html = data.split('\r\n\r\n', 1)
print header
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:f.write(html)

  将HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件,就得到了新浪的首页。

  服务器:服务器端是提供服务的一方。首先,和客户端一样,建立一个socket:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  客户端接下来是设置要连接的端口和ip,所以,此时,服务器端要绑定端口和ip:

# 监听端口:
s.bind(('127.0.0.1', 9999))

  服务器肯能有多块网卡,也就是多个ip。可以只绑定到一块网卡的ip地址上;也可以使用0.0.0.0绑定到所有的网络地址;还可以用127.0.0.1绑定本机地址,此时,就有本机的客户端才能连接。

  接着,调用listen()方法开始监听端口,传入的参数指定最大的链接数量:

s.listen(5)
print 'Waiting for connection...'

  然后,服务器通过一个永久循环来接受客户端的连接,accept()会等待并返回一个客户端的连接:

while True:# 接受一个新连接:sock, addr = s.accept()# 创建新线程来处理TCP连接:t = threading.Thread(target=tcplink, args=(sock, addr))t.start()

  每个连接必须创建一个新的线程(或进程)来处理,不然无法同时应付多个客户端。

  而对于连接之后的处理是,服务器先发送一条欢迎消息,然后等待客户端数据,并加上Hello再发送给客户端。如果发送了exit字符串,就直接关闭连接。

  相应的测试客户端程序:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print s.recv(1024)
for data in ['Michael', 'Tracy', 'Sarah']:# 发送数据:
    s.send(data)print s.recv(1024)
s.send('exit')
s.close()

  客户端和服务端同时运行就可以看到效果:

  • UDP编程

  TCP是建立可靠的连接,UDP则是面向无连接的协议。使用UDP时,只需要知道对方的IP地址和端口号,不需要建立稳定连接,就可以直接发数据包。但是,能不能到达就不知道了。

  它相比于TCP的特点是,速度快,但是不够稳定可靠,适用于不太重要的连接。

  与TCP类似,UDP分为客户端和服务端。服务器首先需要建立socket,然后绑定端口:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))

  其中,SOCK_DGRAM指定这个socket的类型是UDP。绑定端口与TCP一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据:

print 'Bind UDP on 9999...'
while True:# 接收数据:data, addr = s.recvfrom(1024)print 'Received from %s:%s.' % addrs.sendto('Hello, %s!' % data, addr)

  recvfrom()方法返回数据和客户端的地址与端口。这样,服务器接收到数据后,就可以直接调用sendto()就可以把数据用UDP发给客户端。

  而客户端上,首先也是建立socket连接,但是不用建立稳定的连接,所以不要调用connet(),直接通过sendto()将数据传给服务器。

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in ['Michael', 'Tracy', 'Sarah']:# 发送数据:s.sendto(data, ('127.0.0.1', 9999))# 接收数据:print s.recv(1024)
s.close()

  从服务器接收数据仍是调用recv()方法。

  效果如图:

  总的来说,UDP不需要建立稳定的连接,所以数据可能不能安全到达,但是速度快。另外,服务器中绑定的UDP端口与TCP端口互不冲突。

 注:本文为学习廖雪峰Python入门整理后的笔记

转载于:https://www.cnblogs.com/likely-kan/p/7545242.html

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

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

相关文章

计算机应用基础教程作业脑图 车辆工程学院 冯大昕

转载于:https://www.cnblogs.com/FengTang/p/7553055.html

EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本...

为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操作页面, 切换功能模块, 触发页面路由变化时, 再去加载相应需要的资源. 本系列博客的前…

解密阿里云七武器之高性能消息服务ONS

2019独角兽企业重金招聘Python工程师标准>>> 7月22日,首届阿里云分享日上,阿里云正式对外发布了企业级互联网架构解决方案,该服务由EDAS应用框架、ONS消息队列、DRDS分布式数据库组成,能有效解决企业上云后网站过载、性…

windows服务器下的ftp server搭建

软件下载链接:http://pan.baidu.com/s/1eQJbmUY ftpserver1.下载后打开。2.运行安装3.安装目录选择。这里我选择安装在C盘的FTP目录下,直接填写即可。这个安装目录可随意设置。4.安装启动。查看使用教程,添加用户名,设置密码&a…

WordPress获取当前分类ID的四种方法

WordPress获取当前分类ID的四种方法 时间: 2015-01-05 所属栏目: Wordpress教程 作者: WP管理员之家 关键词: wordpress,分类ID 关注热度: 4,346 次 (1条) WordPress获取当前分类ID的方法有很多,今天我来给大家总结一下吧,wordpress主题定制专家-WP管理…

EditPlus3 添加 PHP代码格式化

https://www.jb51.net/softs/23113.html 整合PHPCB到EditPlus: EidtPlus:工具》配置用户工具…》添加工具: 菜单文本:PHPCB 命令:浏览到PHPCB程序。 参数:--space-after-if --optimize-eol --space-aft…

1-17

今天很慵懒啊,啥事也没做,把高精度复习了一遍(hdu1002)。 首先俩字符串数组输入,然后按字符串的长度逆序转到整形数组里 (主要是为了把数值的最低位移动到数组的最低位,方便进位)&am…

FTP下载导致Zip解压失败的原因

情形:网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装,对账文件中有中文和英文的文字,大部分情况下能够下载成功,而且也能解压成功。但是偶尔会出现下载了zip的文件,但是解压失败的情况。解决…

zabbix通过JMX监控Tomcat及一些报错

软件包下载地址:Wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.11/bin/apache-tomcat-7.0.11.tar.gz#安装jdk:Mkdir /usr/lib/jvmTar xf jdk-7u45-linux-x64.gz -C /usr/lib/jvm#在profile追加以下内容 Vim /etc/profileJAVA_HOME"/usr/lib/jvm/j…

C++入门经典-例8.1-类的继承

1:继承是面向对象的主要特征(此外还有封装和多态)之一,它使得一个类可以从现有类中派生,而不必重新定义一个新类。继承的实质就是用已有的数据类型创建新的数据类型,并保留已有数据类型的特点,以…

有意思的PHP代码块-面试经典_无需整理

为什么80%的码农都做不了架构师?>>> 不使用PHP自带反转函数,将字符串反转。//不用自带函数将其反转 方法一 $str "This is PHP"; $strArr explode( ,$str); $count count($strArr)-1; for($i$count;$i>0;$i--){$revStr . $s…

iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)

最近工作比较忙,但是还是出来更新博客了。今天博客中所涉及的内容并不复杂,都是一些平时常见的一些问题,通过这篇博客算是对UITableView中使用定时器的几种方式进行总结。本篇博客会给出在TableView中使用NSTimer或者DispatchSourcer中常见的…

CentOS查看每个进程的网络流量

所需工具nethogs 安装:yum install -y nethogs 使用:nethogs eth0 sudo nethogs -s //按接收流量大小排序 如上图,PID一列就是进程的PID,PROGRAM就是显示进程或连接双方的端口号,前面红框是服务器的IP:端口&#xff0…

转:Java反射教程

原文来自于:http://www.importnew.com/9078.html 什么是反射?反射有什么用处? 1. 什么是反射? “反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。”这个概念常常会和内省(Int…

浅入浅出数据结构(20)——快速排序

正如上一篇博文所说,今天我们来讨论一下所谓的“高级排序”——快速排序。首先声明,快速排序是一个典型而又“简单”的分治的递归算法。 递归的威力我们在介绍插入排序时相比已经见识过了:只要我前面的队伍是有序的,我就可以通过向…

结对第一次作业

同学A : 031502630 - 吴松青 同学B : 031502644 - 邹星 第一次结对作业 本次作业的要求是设计一个方便部门纳新与学生选择部门的app,当然只是原型......刚开始怕要求实现的我们畏首畏尾,总得考虑到后期的实现的困难。最后老师提醒我们不需要实现后&#…

仿美团实现地域选择和城市列表

介绍 在开发O2O相关应用的时候,肯定会有定位,选择所在城市,选择地域,然后再向服务器请求该地区的相关数据,这时就需要我们提供一个导向让用户选择所在区域。 看来看去,最终还是选择模仿美团,感觉…

Ubuntu16.04中php如何切换版本

其实就是一条Linux命令,如下: sudo update-alternatives --config php 会出现下面选项: There are 2 choices for the alternative php (providing /usr/bin/php).Selection Path Priority Status -------------------------------------------------------…

MAC下面maven如何设置让其实下载源码

2019独角兽企业重金招聘Python工程师标准>>> Eclipse--->偏好设置---- >Maven--->download artifact source 转载于:https://my.oschina.net/u/2422498/blog/500292

EventBus使用详解(一)——初步使用EventBus

前言:EventBus是上周项目中用到的,网上的文章大都一样,或者过时,有用的没几篇,经过琢磨,请教他人,也终于弄清楚点眉目,记录下来分享给大家。 相关文章: 1、《EventBus使用…