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

  现有的互联网通讯方式,是服务器端的进程与客户端进程的通信。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

Day-17: 网络编程相关推荐

  1. SE:17.网络编程

    目录 网络编程基础知识 Java的基本网络支持 InetAddress URLDecoder和URLEncoder URL,URLConnection和URLPermission 基于TCP协议的网络 ...

  2. -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp

    计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 网络编程 ...

  3. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  4. linux 网络编程 ping,Linux 网络编程基础(4) -- Ping 的C代码实现

    1.背景 在进行网络编程的时候,通常使用的协议有TCP协议,UDP协议.这些协议在简历套接字之初需要制定套接字的类型,比如TCP应当设置为 SOCK_STREAM, UDP对应的套接字应当设置为SOC ...

  5. Java基础学习总结(18)——网络编程

    一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程. 二.网络通信协议及接口 三.通信协议分层思想 四.参考模型 五.IP协议 每个人的电脑都有一个独一 ...

  6. python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用

    struct模块/ struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传 ...

  7. JAVA网络编程:TCP/IP数据包结构

    2019独角兽企业重金招聘Python工程师标准>>> 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解网络数据 ...

  8. Python网络编程1--笔记

    网络编程 一.客户端与服务器架构 硬件的客户端与服务器架构:打印机服务器,文件服务器 硬件服务器有关门的设备,打印机服务器有打印机,文件服务器NFS有磁盘. 软件的客户端与服务器架构:web服务器,数 ...

  9. Socket网络编程(2)--服务端实现

    中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...

  10. Python3 与 C# 网络编程之~ 网络基础篇

    最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...

最新文章

  1. 【python】用numpy随机生成一元(多元)数据;如线性、指数、三角函数,或者多种样式结合
  2. 图像分类和目标检测技术有什么区别?
  3. 在YII2框架中使用UEditor编辑器发布文章
  4. C#中方法的参数四种类型(值参数、ref、out、params)详解
  5. MapReduce-计数器
  6. linux oracle bad elf,oracle11g安装到red hat6.2 64位系统报错:/lib/ld-linux.so.2: bad ELF interpreter...
  7. 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)
  8. 【转】UINavigationBar 使用总结
  9. python写一个计时器_Python 实现一个计时器
  10. 模型保存的方法-----保存整个模型
  11. Qt 学习之路 :访问网络(4)
  12. 2012网页设计趋势(上)
  13. 排序算法2:直接选择排序
  14. OSPFv3配置实例
  15. mysql数据库学习(一)
  16. 在CAD中修改标注箭头端样式需要怎么操作?
  17. ad如何自动布线布单层_pcb单层板如何布线_pcb单层板自动布线设置
  18. linux中tac的用法,如何在Linux中使用“cat”和“tac”命令与示例
  19. 读书有益——》《断舍离·舍·做减法的勇气》
  20. 那些年遇到的DB2大坑

热门文章

  1. 数据存储(SharedPreferences存储)
  2. 【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局
  3. 什么时候用synchronized
  4. 二十年来一直没搞清楚的一个问题
  5. 以后可能用到的一些OQL
  6. word模板生成word报表文档
  7. kubeadm安装kubernetes 1.13.2多master高可用集群
  8. 区块链监管的一年,剥离“币”的区块链技术该何去何从?
  9. mysql 1449 : The user specified as a definer ('usertest'@'%') does not exist 解决方法 (grant 授予权限)...
  10. UIImageView01