网络编程概述

  1. 使用网络编程能够把多方链接在一起,然后可以进行数据传递。

  2. 所谓的网络编程就是,让不同的电脑上的软件能够进行数据传递,即:进程之间的通信。

  3. ip 地址,协议,端口就可以标识网络的进程,网络中的进程通信利用这个标志与其它进程进行交互

    1. 所谓进程指的是:运行的程序以及运行时用到的资源这个整体称之为进程(在讲解多任务编程时进行详细讲解)
    2. 所谓进程间通信指的是:运行的程序之间的数据共享

Socket

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的

预备知识

局域网 ip

在这么多网络 IP 中,国际规定有一部分 IP 地址是用于我们的局域网使用,也就

是属于私网 IP,不在公网中使用的,它们的范围是:

1
2
3
4
5
10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.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 是一种由系统指定动态生成的端口。

套接字的使用

套接字的使用流程和文件的使用流程很类似

  1. 创建套接字

    在 Python 中使用 socket 模块的函数 socket 便可以完成

    1
    2
    inport 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 协议)
  2. 使用套接字收/发数据

  3. 关闭套接字

1
2
3
4
5
6
7
8
9
10
11
12
import socket

#创建 tcp 的套接字
s = socket.socket(socket.AE_INET, socket.SOCK_STREAM)

#或创建 udp 套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#...这里是使用套接字的功能(省略)。。。

#不用的时候,关闭套接字。
s.close()

如果报错

SyntaxError:Non-ASCII character '' in file

那你是用 Python 2 运行的,而且没有加编码。你需要使用 Python 3 运行。

注意:你的 python 代码下不要新建与你导入的库名字一样的 py 文件,否则会优先导入它。

编程规范

代码不是从第一行开始写的, 而是首先写入口函数,然后使用到什么,再去引入什么模块或库。

编程时先写

1
2
if  __name__=='__main__'
main()

然后再去上面写函数

开发中写函数名如果遇到 to 一般写为 2

注释规范:

  1. 如果注释在一行的行头,直接写 #,然后空一个空格,再写
  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 名字

如果你想要在文件名中使用括号,那么需要使用反斜杠转义。

参考资料:

本机 IP 地址、 127.0.0.1 和 0.0.0.0 的区别

python-note