Part 8.网络编程--Socket, Udp

(一)socket简介python

1.本地的进程间通讯(IPC)有不少种方式,例如

  • 队列
  • 同步(互斥锁、条件变量等)

以上通讯方式都是在一台机器上不一样进程之间的通讯方式,那么问题来了编程

网络中进程之间如何通讯?也就是要从一台电脑的某个进程把数据经过网络传到另外一台电脑上的某个进程如何实现呢?服务器

2. 网络中进程之间如何通讯

首要解决的问题是如何惟一标识一个进程,不然通讯无从谈起!网络

本地能够经过进程PID来惟一标识一个进程,可是在网络中这是行不通的。socket

其实TCP/IP协议族已经帮咱们解决了这个问题,网络层的“ip地址”能够惟一标识网络中的主机,而传输层的“协议+端口”能够惟一标识主机中的应用程序(进程)。tcp

这样利用ip地址,协议,端口就能够标识网络的进程了,网络中的进程通讯就能够利用这个标志与其它进程进行交互。函数

3. 什么是socket

socket(简称 套接字) 是进程间通讯的一种方式,它与其余进程间通讯的一个主要不一样是:编码

它能实现不一样主机间的进程间通讯,咱们网络上各类各样的服务大多都是基于 Socket 来完成通讯的spa

例如咱们天天浏览网页、QQ 聊天、收发 email 等等操作系统

4. 建立socket

在 Python 中 使用socket 模块的函数 socket 就能够完成:

socket.socket(AddressFamily, Type)

说明:

函数 socket.socket 建立一个 socket,返回该 socket 的描述符,该函数带有两个参数:

  • Address Family:能够选择 AF_INET(用于 Internet 进程间通讯) 或者 AF_UNIX(用于同一台机器进程间通讯),实际工做中经常使用AF_INET
  • Type:套接字类型,能够是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议

建立实例:

1 import socket
2 
3 #建立tcp套接字
4 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5 #建立udp套接字
6 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

 

(二)UDP介绍

  • 简介

UDP --- 用户数据报协议,是一个无链接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在传输数据报前不用在客户和服务器之间创建一个链接,且没有超时重发等机制,故而传输速度很快

UDP是一种面向无链接的协议,每一个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,所以可否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

  • 特色

UDP是面向无链接的通信协议,UDP数据包括目的端口号和源端口号信息,因为通信不须要链接,因此能够实现广播发送。 UDP传输数据时有大小限制,每一个被传输的数据报必须限定在64KB以内。 UDP是一个不可靠的协议,发送方所发送的数据报并不必定以相同的次序到达接收方。

  • 适用状况

UDP是面向消息的协议,通讯时不须要创建链接,数据的传输天然是不可靠的,UDP通常用于多点通讯和实时的数据业务,好比:语音广播,视频,QQ,TFTP(简单文件传送),SNMP(简单网络管理协议),RIP(路由信息协议,如报告股票市场,航空信息),DNS(域名解释)

注重速度流畅

UDP操做简单,并且仅须要较少的监护,所以一般用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就能够了,这种状况下显然使用UDP会更合理一些。

 

(三)udp网络程序---发送,接受数据

建立一个udp客户端程序的流程是简单,具体步骤以下:

  1. 建立客户端套接字
  2. 发送/接收数据
  3. 关闭套接字

实例代码:

 1 from socket import *
 2 
 3 #1.建立udp套接字
 4 udpSocket = socket(AF_INET, SOCK_DGRAM)
 5 
 6 #2.准备接收方地址
 7 sendAddr = ('192.168.254.1', 8080)
 8 
 9 #3.从键盘上获取输入内容
10 sendData = input("请输入数据:")
11 
12 #4.发送数据到指定的电脑上
13 udpSocket.sendto(sendData.encode('gb2312'), sendAddr)
14 
15 #5等待接受对方发送的数据
16 recvData = udpSocket.recvfrom(1024)
17 
18 #6.显示对方发送的数据
19 recvContent,recvAddr = recvData
20 print(recvContent.decode('gb2312'), recvAddr)
21 
22 #7.关闭套接字
23 udpSocket.close()

网络调试助手截图:

这里须要注意13行代码,咱们传输要进行编码后才能传输,可采用国际通用的‘UTF-8’或者我国的‘gb2312’,当咱们传输过去后,对方须要进行解码,当对方传过来时,咱们须要解码,因此,咱们须要了解对方的编码方式,不然有时会出现乱码的状况。

 

(四)udp网络程序--端口问题

  •  会变的端口号:

 从新运行屡次程序,而后在“网络调试助手”中,看到的现象以下:

说明:

  • 每从新运行一次网络程序,上图中红圈中的数字不同的缘由在于,这个数字标识这个网络程序,当从新运行时,若是没有肯定到底用哪一个,系统默认会随机分配;
  • 记住一点:这个网络程序在运行的过程当中,这个就惟一标识这个程序,因此若是其余电脑上的网络程序若是想要向此程序发送数据,那么就须要向这个数字(即端口)标识的程序发送便可。

 

(五)udp绑定信息

  • 绑定信息

以前咱们说一个网络程序在每次运行的时候端口是随机变化的

通常状况下,在一天电脑上运行的网络程序有不少,而各自用的端口号不少状况下不知道,为了避免与其余的网络程序占用同一个端口号,每每在编程中,udp的端口号通常不绑定。

可是若是须要作成一个服务器端的程序的话,是须要绑定的,想一想看这又是为何呢?

  • 绑定实例  
 1 #coding=utf-8
 2 
 3 from socket import *
 4 
 5 #1. 建立套接字
 6 udpSocket = socket(AF_INET, SOCK_DGRAM)
 7 
 8 #2. 绑定本地的相关信息,若是一个网络程序不绑定,则系统会随机分配
 9 bindAddr = ('', 7788) # ip地址和端口号,ip通常不用写,表示本机的任何一个ip
10 udpSocket.bind(bindAddr)
11 
12 #3. 等待接收对方发送的数据
13 recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
14 
15 #4. 显示接收到的数据
16 print recvData
17 
18 #5. 关闭套接字
19 udpSocket.close()
  • 总结

一个udp网络程序,能够不绑定,此时操做系统会随机进行分配一个端口,若是从新运行次程序端口可能会发生变化

一个udp网络程序,也能够绑定信息(ip地址,端口号),若是绑定成功,那么操做系统用这个端口号来进行区别收到的网络数据是不是此进程的

 

(六)udp网络通讯过程

 

如上就是其一个简单的演示,当咱们从传输方传输数据时,每通过一层便会给它加上一些信息也叫作组包,而后传给接收方,接收方接受后每通过一层又会相应的解包,最后把信息传给指定进程。

相关文章
相关标签/搜索