Python 网络编程简介
网络编程概述
使用网络编程能够把多方链接在一起,然后可以进行数据传递。
所谓的网络编程就是,让不同的电脑上的软件能够进行数据传递,即:进程之间的通信。
ip 地址,协议,端口就可以标识网络的进程,网络中的进程通信利用这个标志与其它进程进行交互
- 所谓
进程
指的是:运行的程序以及运行时用到的资源这个整体称之为进程(在讲解多任务编程时进行详细讲解) - 所谓
进程间通信
指的是:运行的程序之间的数据共享
- 所谓
Socket
socket(简称 套接字
)
是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
预备知识
局域网 ip
在这么多网络 IP 中,国际规定有一部分 IP 地址是用于我们的局域网使用,也就
是属于私网 IP,不在公网中使用的,它们的范围是:
1 | 10.0.0.0~10.255.255.255 |
169 开头
169.254.X.X 是 Windows 操作系统 在 DHCP 信息租用失败时自动给客户机分配的 IP 地址..
由于网络连接问题(网线问题,DHCP 服务器(其实就是 Modem,路由器,或提供共享上网的主机)问题等),
而令 DHCP 信息租用失败,而 IP169.254.X.X 的分配可能会令客户机(你自己的计算机,设置了"自动获取 IP")与所处局域网网关(Modem,路由器,或提供共享上网的主机) 位于不同的网段中,而无法与网关通信,而导致无法接入 Internet 的情况...
环回地址 127.0.0.1
严格来说 127.0.0.1 只是环回地址之一。所有 127.x.x.x 都是环回地址。从 127.0.0.0 到 127.255.255.255 均予以保留。此地址块中的任何地址都将环回到本地主机中。此地址块中的任何地址都绝不会出现在任何网络中。
环回地址:所有发往该类地址的数据包都应该被 loop back。正常的网络包从
IP 层进入数据链路层,然后发送到网络上,
而发向loopback
地址的包,直接在 IP 层短路了,也就是发到 IP
层的包直接被 IP 层接收了,不再向下发送。
环回地址主要用来做回环测试,通过使用 ping 127.0.0.1 测试某台机器上的网络设备,操作系统或者 TCP/IP 实现是否工作正常。
任何地址 0.0.0.0
0.0.0.0 不能 ping 通。0.0.0.0
就是任何地址IP_ADDR_ANY
,任何地址的意思就是包括环回地址。
任何地址IP_ADDR_ANY
的意思也就是,不管主机有多少个网口,多少个
IP,如果监听本机的 0.0.0.0 上的端口,就等于监听机器上的所有 IP
端口。数据报的目的地址只要是机器上的一个 IP 地址,就能被接受。
以上两段出自下面的本机IP地址、 127.0.0.1 和 0.0.0.0 的区别
参考文章,写的挺好的,感觉没什么要改的。
0 端口:
端口号 0 是一个预留的端口号,代表的意思就是它在 TCP 或者 UDP 网络传输中应该不会被用到。但是在网络编程中,尤其是在 unix socket 编程当中,它有一些特殊的含义。在 unix socket 编程当中,端口号 0 是一种由系统指定动态生成的端口。
套接字的使用
套接字的使用流程和文件的使用流程很类似
创建套接字
在 Python 中使用 socket 模块的函数 socket 便可以完成
1
2inport socket
socket.socket(AddressFamily, Type)- Address Family:协议族,代表你选择 IPv4 还是 IPv6(IPv4 对应参数 AF_INET, IPv6 对应参数 AF_INET6)。可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用 AF_INET
- Type:套接字类型(传输协议类型,TCP 或 UDP),可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
使用套接字收/发数据
关闭套接字
1 | import socket |
如果报错
SyntaxError:Non-ASCII character '' in file
那你是用 Python 2 运行的,而且没有加编码。你需要使用 Python 3 运行。
注意:你的 python 代码下不要新建与你导入的库名字一样的 py 文件,否则会优先导入它。
编程规范
代码不是从第一行开始写的, 而是首先写入口函数,然后使用到什么,再去引入什么模块或库。
编程时先写
1 | if __name__=='__main__' |
然后再去上面写函数
开发中写函数名如果遇到 to 一般写为 2
注释规范:
- 如果注释在一行的行头,直接写 #,然后空一个空格,再写
- 如果在一行的代码后面, 那么首先要空两格空格,然后写 # ,再空一格空格写注释.
函数与函数之间要空两行,第一个函数与前面也要空两行.
写函数时,要想想其需不需要参数。
Windows 默认编码 GBK , 所以我们对从 Windows 收到的数据要使用 GBK 解码.
Mac 或 Linux 使用 utf-8 即可
发送数据不需要绑定端口,系统会随机分配一个端口, 但是接收方需要绑定端口,才能正确地收到数据.
所以如果你想即发消息又收消息,那你需要绑定端口.
一个套接字可以同时收发数据, 即:socket 套接字是全双工.
单工: 收音机等, 只能进行一个方向的动作
半双工: 可以双向走,但同一时刻只能有一个方向
全双工: 同一时刻既可以收又可以发.
Ubuntu python 编程杂记
Ubuntu 上有 ipython 3 是 python 交互模式的增强版,支持 Linux 命令(清屏,补全等)
vim 快捷键 按下 V,上下选中,shift < 或 shfit >
跳到指定行: 切换到命令模式,然后 输入行号,再输入大写的 G(即: shift + g)
从命令模式到编辑模式:
大写的 i 是调到行首, 大写的 a 是跳到行尾.
Ctrl + shift + t : 再开一个终端标签页
复制剪切粘贴的快捷键
如果要在打开 vim 将鼠标定位到错误行,那在打开命令后: [空格]+行号
如果使用 vim 直接 vim 回车,没有写文件名,那保存的时候使用一下命令然后回车。
:w 名字
如果你想要在文件名中使用括号,那么需要使用反斜杠转义。
参考资料: