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.' % addr
s.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入门整理后的笔记
Day-17: 网络编程的更多相关文章
- 17 网络编程 C/S架构介绍
1.什么是C/S架构 C指的是client(客户端软件),S指的是Server(服务器软件),本章的重点是教大家写一个C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 2.计算机基础的知识- ...
- -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp
计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 网络编程 ...
- Android(java)学习笔记17:网络编程的概述
1. 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- python网络编程
Socket是网络编程的一个抽象的概念. 通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套 ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- Python 网络编程(一)
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- [转]12篇学通C#网络编程——第二篇 HTTP应用编程(上)
本文转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/09/2316745.html 我们学习网络编程最熟悉的莫过于Http,好,我们就从 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- Python开发【第八篇】:网络编程 Socket
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
随机推荐
- 程序员的Epic Fail [0]
作为程序员,我们经常会被客户问的一个问题一定是不是说很容易么,为什么花了这么长时间.不得不说,程序员可能是最糟糕的计划者,按时按点按计划完成的软件项目永远是下一个项目.一个项目的延期,有很多这样那样的 ...
- C++中printf和scanf的用法
(一)printf的用法 printf:按格式打印,向控制台输出.print:打印 ,f:formate,格式化. 在使用printf向控制台输出时,不建议使用中文字符串,中文字符串的问题比较复杂,有 ...
- 免费的Lucene 原理与代码分析完整版下载
Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的 ...
- How to resolve the truncate/drop/delete/join hang issue in ADW
In some case, we found that when we execute the sql commands like truncate table, drop table, delete ...
- EntityFunctions
提供在 LINQ to Entities 查询中的一些static方法 例如: EntityFunctions.CreateDateTime , , ) == created);
- 【Tomcat】shell获得war包
功能: 将maven项目打包复制到tomcat/webapps set git=C:\Users\zhengwenqiang\git set tomcat=e:\tomcat7.0.64 c: cd ...
- RestTemplate post如何传递参数
背景 今天跟同事接口联调,使用RestTemplate请求服务端的post接口(使用python开发).诡异的是,post请求,返回500 Internal Server Error,而使用get请求 ...
- informatica9 安装下载,安装教程 介质(文章和视频教程)(csdn讲师:Array)
Informatica学习: 参考文献:视频参考地址:http://edu.csdn.net/course/detail/5034,ETL之informatica9通关班(第二期) 1.安装介质的获 ...
- 高阶自定义View --- 粒子变幻、隧道散列、组合文字
高阶自定义View --- 粒子变幻.隧道散列.组合文字 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:h ...
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
前言:在Remoting中处理事件其实并不复杂,但其中有些技巧需要你去挖掘出来.正是这些技巧,仿佛森严的壁垒,让许多人望而生畏,或者是不知所谓,最后放弃了事件在Remoting的使用.关于这个主题,在 ...