Python 高级 3

1.编辑器vim

目标

  能够说出vim三种工作模式

  能够写出vim复制、剪切、粘贴、选中多行命令

      yy,dd,p,数字+V

  能够写出查找、替换命令

      :/要查找的内容,n下一个,N上一个

      :%s/要替换的内容/新内容/g

      :10-20s/要替换的内容/新内容

<1>vim简

vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器

vim有三种基本工作模式:

  命令模式

  编辑模式

  末行模式。

<2>命令行模式

任何时候,不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令模式;我们在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也是处于该模式下。在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。

<3>编辑模式

在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键ESC即可。

<4>末行模式

在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。例如:

:sp newfile

则分出一个窗口编辑newfile文件。如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。

<5>vim基础操作

vim是从 vi 发展出来的一个文本编辑器 。代码补完、编译及错误跳转等方便编程的功能特别丰富

进入插入模式:

i: 插入光标前一个字符

I: 插入行首

a: 插入光标后一个字符

A: 插入行未

o: 向下新开一行,插入行首

O: 向上新开一行,插入行首

进入命令模式:

ESC:从插入模式或末行模式进入命令模式

移动光标:

h: 左移

j: 下移

k: 上移

l: 右移

M: 光标移动到中间行

L: 光标移动到屏幕最后一行行首

G: 移动到指定行,行号 -G

w: 向后一次移动一个字

b: 向前一次移动一个字

Ctr+d: 向下翻半屏

Ctr+u: 向上翻半屏

Ctr+f: 向下翻一屏

Ctr+b: 向上翻一屏

gg: 光标移动文件开头

G: 光标移动到文件末尾

删除命令:

x: 删除光标后一个字符,相当于 Del

X: 删除光标前一个字符,相当于 Backspace

dd: 删除光标所在行,n dd 删除指定的行数。也是剪切的意思,配合p粘贴使用,如果没有粘贴就是删除。

D: 删除光标后本行所有内容,包含光标所在字符

d0: 删除光标前本行所有内容,不包含光标所在字符

dw: 删除光标开始位置的字,包含光标所在字符

撤销命令:

u: 一步一步撤销

Ctr-r: 反撤销

重复命令:

.: 重复上一次操作的命令

文本行移动:

>>: 文本行右移

<<: 文本行左移

复制粘贴:

yy: 复制当前行,n yy 复制 n 行

p: 在光标所在位置向下新开辟一行,粘贴

可视模式:

v: 按字符移动,选中文本

V: 按行移动,选中文本可视模式可以配合 d, y, >>, << 实现对文本块的删除,复制,左右移动

替换操作:

r: 替换当前字符

R: 替换当前行光标后的字符

查找命令:

:/查找内容

n: 下一个

N: 上一个

替换命令:

把abc全部替换成123

末行模式下,将当前文件中的所有abc替换成123

:%s/abc/123/g

末行模式下,将第一行至第10行之间的abc替换成123

:1, 10s/abc/123/g

因为是范围内替换,最后可以不用加g

小结:

  %表示整个文件, 1, 10表示1到10行范围内

  s表示替换

  g表示全局

<6>设置vim显示行号

  1 >临时显示行号

      如果只是临时显示vim的行号,只须按ESC键退出编辑内容模式,输入“:set number”后按回车键,就可以显示行号了。行号显示只是暂时的,退出vim后再次打开vim就不显示行号了。

  2>永久显示行号

      如果想让vim永久显示行号,则需要修改vim配置文件vimrc。如果没有此文件可以创建一个。在启动vim时,当前用户根目录下的vimrc文件会被自动读取,因此一般在当前用户的根目录下创建vimrc文件,即使用下面的命令:

          ■ vim ~/.vimrc

          ■ 在打开的vimrc文件中最后一行输入:set number ,然后保存退出。再次用vim打开文件时,就会显示行号了。

2.Linux 命令总结

  1. 启动终端: ctr+alt+t

  2. 终端字体放大: ctr+shift+'+',终端字体缩小: ctr+'-'

  3. ls: 查看当前目录下的文件信息

  4. pwd: 查看目录所在的路径

  5. touch: 创建文件

  6. mkdir: 创建文件夹

  7. rmdir: 删除文件夹,提示:只能是空文件夹

  8. rm: 默认删除的是文件,如果删除文件夹需要加上-r选项,-r:以递归的方式把文件夹下的所有文件信息删除掉

  9. cd:切换目录

9.1 cd 目录名 : 切换到指定目录

9.2 cd .: 切换到当前目录

9.3 cd ..: 切换到上一级目录

9.4 cd ~: 切换到当前用户的目录

9.5 cd: 等价与cd ~ 切换到当前用户的目录

9.6 cd -: 切换到上一次目录

  10. 绝对路径: 从根目录算起的路径叫做绝对路径,比如: /home/python

  11. 相对路径: 从当前目录算起的路径叫做相对路径, 比如: ./AAA ../BBB

  12. 路径的使用总结: 如果离当前目录近使用相对路径,如果离根目录近使用绝对路径,如果进入的是中间目录建议使用绝对路径

  13. 自动补全: 两次tab键

  14. cp: 拷贝

14.1 cp 文件名 路径: 把文件拷贝到指定路径

14.2 cp 路径/文件名 路径: 把指定路径的文件拷贝到指定路径

14.3 cp 文件名 路径/新的文件名 : 先把文件拷贝到指定目录然后再重命名

14.4 cp 文件夹 路径 -r: 拷贝文件夹 -r:以递归的方式把文件夹下的所有文件拷贝过去

  15. mv: 移动(剪切)

15.1 mv 文件名 路径: 把文件移动到指定路径

15.2 mv 路径/文件名 路径: 把指定路径的文件移动到指定路径

15.3 mv 文件名 新的文件名: 重命名

15.4 mv 文件夹 路径: 把文件夹移动到指定目录,不需要加上-r

  16. tree: 以目录树方式显示当前文件夹信息

16.1 tree / : 以目录树方式显示指定路径的文件信息

  17. 命令的格式

17.1 命令名 选项 参数, 提示:有些命令选项可以放到参数的后面,但是:scp 选项必须要放到命令名的后面

  18. ls 选项

18.1 -l: 以列表的方式取显示

18.2 -a: 显示隐藏文件

18.3 -h: 显示文件大小的单位

  19. mkdir 选项

19.1 -p: 把依赖文件夹提取创建好,比如: mkdir 123/456/789 -p

  20. rm选项

20.1 -r: 以递归的方式删除文件夹里面的所有内容

20.2 -i: 显示删除的时候提醒信息

20.3 -v: 显示删除后的描述信息

20.4 -d: 删除空目录

20.5 -f: 如果文件或者目录存在则删除,否则就不删除也不会报错

  21. cp选项

21.1 -i:拷贝文件的时候如果指定目录有该文件需要显示提醒信息

21.2 -v:显示拷贝文件的路径描述

21.3 -r:以递归的方式拷贝文件夹里面的所有内容

  22. mv选项

22.1 -i:移动文件显示提醒信息

22.2 -v:显示移动后的路径描述

  23. 重定向(>,>>): 在终端显示的内容信息重写规定方向,保存到指定文件里面,以后查看数据是文件查看就可以了

23.1 > :如果文件不存在,那么先创建,否则会先把原有文件的数据清空然后再写入

23.2 >> : 在原有数据的基础上进行追加

23.3 总结: ls, cat, tree都可以使用重定向

  24. gedit:文本编辑工具,可读可编辑

  25. cat: 内容在终端显示,不能进行编辑,提示:适合查看小型文件,大型文件使用分屏方式显示(more)

  26. more:分屏显示

26.1 f:表示下一页

26.2 空格:表示下一页

26.3 回车: 表示下一行

26.4 b:表示上一页

26.5 q:退出

  27. 文件合并 cat 1.txt 2.txt > 3.txt

  28. 管道: 可以理解成是一个容器,存放在终端显示的内容

28.1 总结: ls /bin | more , cat, tree, ls都是可以结合管道使用完成分屏显示的

  29. 链接

29.1 软连接:可以理解成快捷方式,把原文件删除掉通过软链接无法打文件的数据, 提示:创建软连接不会对硬链接数加1

29.2 硬连接: 同一个数据有多个文件名在使用,某个文件删除掉,还可以通过其它文件名访问这个文件的数据, 提示:创建硬链接硬链接数会加1

29.3 提示:如果创建的软链接没有和原文件在同一个目录里面,那么需要使用绝对路径创建软连接

  30. grep: 根据指定的内容在文件中进行查找

30.1 grep "a" 8.txt : 根据指定内容在文件中进行查找

30.2 -n:行号, -i:忽略大小写 -v: 取反

30.3 总结: ^,$ [], . 支持的正则表达式

  31. find:在指定目录查找对应的文件

31.1 find . -name ".txt": 在当前目录查找后缀是.txt的文件, -name根据文件名查找

31.2 find . -perm 666: 在当前目录查找文件权限是可读可写的, -perm根据权限查找

31.3 总结: ? [] 支持的通配符

  32. ls:支持的通配符: *,? , [], []:表示匹配任意列举中的一个字符

  33. 通配符: ? * [],起到了模糊查询的作用

  34. tar: 打包、压缩、解包、解压缩

34.1 打包 tar -cvf test.tar *.txt, -c: 表示要打包, -v:显示文件打到包里面 -f:表示文档名称,提示-f必须放到所有选项的后面

34.2 解包 tar -xvf test.tar , -x:表示解包

34.3 打包及压缩合并的命令:tar -zcvf test.tar.gz *.txt

34.4 解压缩及解包合并的命令:tar -zxvf test.tar.gz ->得到对应的文件

34.5 指定解压缩的路径 tar -zxvf test.tar.gz -C ../BBB, -C:指定解压缩后的路径

34.6 tar -jcvf test.bz2 *.txt -> test.bz2

34.7 tar -jxvf test.bz2 -> 得到对应的文件

34.8 -C: 指定解压缩的路径: tar -jxvf test.bz2 -C ../BBB

  35. zip的压缩及解压缩

35.1 zip test *.txt -> test.zip ,提示:压缩包的后缀不需要指定默认是.zip

35.2 unzip test.zip -> 得到是压缩包里面的文件

35.3 unzip -d ./123 test.zip -> 解压到指定路径 , -d:表示解压的路径

  36. chmod:修改权限

36.1 -r(4):可读 -w(2):可写 -x(1):可执行

36.2 u:当前用户 g: 同组用户 o: 其它用户 a:所有用户

36.3 +:添加权限, -:撤销权限 , = : 赋值权限

36.4 chmod 000 1.txt : 全部没有权限

36.5 chmod a=- 1.txt chmod a= 1.txt : 全部没有权限

36.6 chmod 777 1.txt chmod a=rwx 1.txt : 都权限,可读可读可执行

36.7 chmod 664 1.txt chmod u=rw,g=rw,o=r 1.txt 设置不同用户不同权限

  37. cp选项

37.1-a: 保留文件原有权限,-a包含-r,也就是使用-a也可以拷贝文件夹

  38. which : 查看命令的路径

  39. sudo -s: 切换到管理员账号

  40. passwd:修改密码

  41. who :当前那些用户登陆

  42. whoami:当前电脑登陆的用户是谁

  43. exit:退出

  44. ssh: 远程登陆 44.1 ssh : 可以远程登陆服务端可以通过vim修改文件

  45. scp: 远程拷贝

45.1 scp 1.txt python@192.168.107.132:/home/python/Desktop ,把本地文件拷贝到服务器端

45.2 scp -r test python@192.168.107.132:/home/python/Desktop,把本地文件夹拷贝到服务器端

45.3 scp python@192.168.107.132:/home/python/Desktop/1.txt . , 把服务端的文件拷贝的本地

45.4 scp -r python@192.168.107.132:/home/python/Desktop/test . , 把服务端的文件夹拷贝的本地

  46. apt list 支持的安装包

  47. vim的使用

47.1 命令模式, 编辑模式, 末行模式, 命令模式是编辑模式和末行模式的中转站

  48. vim常用命令

命令模式下:

  i:插入模式光标之前插入

  I:行首插入

  o:光标下一行插入

  O:光标上一行插入

  a:光标之后插入

  A:行尾插入

  j:向下移动

  k:向上移动

  l:向右移动

  h:向左移动

  gg:跳至首行

  G:跳至末行,数字+G:跳至指定行

  L:跳至末行

  yy:复制,数字+yy:从当前行复制指定行数

  dd:剪切,数字+dd:从当前行剪切指定行数 D删除光标后本行所有内容,包含光标

  p:粘贴

  u:撤销

  M:跳转至屏幕中间一行

  w:向后移动一个单词

  b:向前移动一个单词

  Ctrl+d:向下翻半屏

  Ctrl+u:向上翻半屏

  Ctrl+f:向下翻一屏

  Ctrl+b:向上翻一屏

  Ctrl+r:反撤销

  r:替换当前字符

  R:替换光标后的字符

  x:删除光标后一个字符

  X:删除光标前一个字符

  d0:删除光标前本行所有内容,不包含当前光标所在位置

  dw:删除光标开始位置的单词,包含当前字符

  >>:向右缩进 数字+>>:当前行开始的指定行数向右缩进

  <<:向左缩进 数字+<<:当前行开始的指定行数向左缩进

  v:从当前字符选择 选择后:y:复制 d:剪切

  V:从当前行选择  选择后:y:复制 d:剪切

  Shift+;:进入末行模式

末行模式下

    q:退出

    q!:强制退出,不保存

    w:保存

    wq:保存并退出

    x:保存并退出

    /:字符串查找  n:下一个  N:上一个

    %s/old/new/g:把文本中的old全部替换为new

    2,10s/old/new/g:把文本中2到10行中的old替换为new

    !:直接在vi中执行shell命令

3.乌班图执行python文件

./1.py 直接执行.py文件,需要先在.py文件的首行输入 #!/usr/bin/python3

#!后面跟python3的路径,python3所在的路径可以用which python3查询

4.网络

<1>网络概述

    什么是网络

网络就是指将具有独立功能的多台计算机通过通信线路连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。

通俗理解网络就是把双方或者多方设备连接起来的一个工具,然后可以进行数据传递

  学习网络的目的

能够编写基于网络通信的软件,通过网络把数据从一方传递到另外一方,完成数据的共享

通俗来说就是能够进行网络编程,开发网络通信程序或者软件。

<2>ip地址

  ip地址的概念

ip地址是标识网络中唯一的一台设备的

  ip地址的作用

通过ip地址找到网络中唯一一台设备,然后可以给设备发送数据

  私有ip

私有ip就是局域网中使用的ip地址,国际规定有一部分ip地址是在局域网中使用的

私有ip的范围,也就是不在公网中使用的ip地址范围:

  10.0.0.0~10.255.255.255

  172.16.0.0~172.31.255.255

  192.168.0.0~192.168.255.255

  本机ip地址

127.0.0.1表示本机ip地址; 本机域名是localhost; 通过域名可以解析一个ip地址,域名方便大家记忆某台电脑的主机地址

<3>Linux命令(ping, ifconfig)

  查看或配置网卡信息:ifconfig

  mac和Linux 用 ifconfig

  Windows 用 ipconfig

  测试远程主机连通性:ping

      通常用ping来检测网络是否正常

小结

  1.ping 127.0.0.1 检查本地网卡是否正常

  2.ping www.baidu.com 检查是否能上公网

  3.ping 当前局域网的ip地址 检查是否在同一个局域网内

<4>端口

  什么是端口

端口是传输数据的通道,好比教室的门,是数据传输必经之路。

如果一个程序需要收发网络数据,那么就需要有这样的端口

  端口号

问题:一个电脑上运行着多个应用程序,都需要收发数据,如何区分给那个应用程序呢?

既然有这么多端口,操作系统为了统一管理,所以进行了编号,这就是端口号

端口号:使用唯一一个编号来标识端口, 其实就是标识端口的一个编号。

在linux系统中,端口号有65536(2的16次方)个

  端口号划分

端口号不是随意使用的,而是按照一定的规定进行分配。

端口号分为知名端口号和动态端口号

  知名端口号(Well Known Ports)

知名端口号: 系统程序使用的端口号

知名端口号是众所周知的端口号,范围从0到1023

80端口分配给HTTP服务

21端口分配给FTP服务

一般情况下,如果一个程序需要使用知名端口的需要有root权限

  动态端口号(Dynamic Ports)

动态端口号: 程序员开发应用程序使用端口号, 之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。

动态端口的范围是从1024到65535

  注册端口:端口1024到49151

  动态端口:从49152到65535

当这个程序关闭时,同时也就释放了所占用的端口号

  怎样查看端口号 ?

      用 netstat -an 查看程序所使用的端口号

      lsof -i [tcp/udp]:2425 查看端口号对应的应用程序

提示: 如果端口号找不到应用程序,使用管理员权限加上sudo

可以全部用sudo lsof -i:端口号

总结:

网络通信的流程是先通过ip地址找到网络中的设备,再通过端口号来找到对应的端口,然后通过端口把数据传输给对应的应用程序

5.网络传输方式-UDP

<1>UDP概念

UDP:英文全拼(User Datagram Protocol)简称用户数据报协议,它是无连接的、不可靠的网络传输协议

<2>UDP特点

因为udp发送数据之前不需要建立连接所以具有以下特点

      无连接

      资源开销小

      传输速度快

      udp每个数据包最大是64K

<3>UDP的优缺点

优点:

  传输速度快

  不需要连接,资源开销小

缺点:

  传输数据不可靠,容易丢数据包

  没有流量控制,当对方没有及时接收数据,发送方一直发送数据会导致缓冲区数据满了,电脑出现卡死情况,所有接收方需要及时接收数据。

<4>UDP的使用场景

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP

  qq音视频传输,微信音视频传输

  上课使用的共屏软件

  发送广播消息

小结:

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

6.socket介绍

<1>不同电脑上的进程之间如何通信

首先通过ip地址找到网络中对应的电脑,然后通过传输协议和端口号来确定这个进程(运行起来的软件),那么数据如何传输需要使用socket来完成,也就是进程之间通信使用socket

注意:

所谓进程指的是:运行的程序或者软件称之为进程(在讲解多任务编程时进行详细讲解)

所谓进程间通信指的是:运行的程序之间的数据共享

<2>什么是socket

socket(简称 套接字) 是进程间通信一个工具,它能实现把数据从一方传输到另外一方,完成不同电脑上进程之间的通信, 它好比数据的搬运工。

<3>socket使用场景

不夸张来说,只要跟网络相关的应用程序或者软件都使用到了socket

小结:

  socket就是完成不同电脑上进程之间通信的一个工具,负责进程之间数据的传输

7.udp网络程序-发送、接收数据

<1>udp网络程序流程

创建一个基于udp的网络程序流程很简单,具体步骤如下:

  创建客户端套接字

  发送/接收数据

  关闭套接字

总结: 网络通信的流程

1. 对方的ip地址

2. 应用程序的端口号

3. 数据的传输协议(udp/tcp)

4. 使用socket收发数据

<2>创建socket

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

import socket

socket.socket(AddressFamily, Type)

说明:

函数 socket.socket 创建一个 socket,该函数带有两个参数:

Address Family:IP地址类型; AF_INET表示ipv4类型、AF_INET6表示ipv6类型; Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

创建一个udp socket(udp套接字)

import socket

# 创建udp的套接字

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

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

# 不用的时候,关闭套接字

s.close()

说明

套接字使用流程 与 文件的使用流程很类似 创建套接字 使用套接字收/发数据 关闭套接字

<3>发送数据sendto()

代码如下:

import socket

# 1. 创建udp套接字

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2. 准备接收方的地址

# '192.168.1.103'表示目的ip地址

# 8080表示目的端口

dest_addr = ('192.168.1.103', 8080)  # 注意 是元组,ip是字符串,端口是数字

# 3. 从键盘获取数据

send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上的指定程序中

udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 关闭套接字

udp_socket.close()

<4>发送、接收数据

import socket

# 1. 创建udp套接字

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2. 准备接收方的地址

dest_addr = ('192.168.236.129', 8080)

# 3. 从键盘获取数据

send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上

udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 等待接收对方发送的数据

recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数

# 6. 显示对方发送的数据

# 接收到的数据recv_data是一个元组

# 第1个元素是对方发送的数据

# 第2个元素是对方的ip和端口

print(recv_data[0].decode('gbk'))

print(recv_data[1])

# 7. 关闭套接字

udp_socket.close()

8.数据编码和解码

  编码和解码操作

      str->bytes:encode编码

      bytes->str:decode解码

字符串通过编码成为字节码,字节码通过解码成为字符串。

  其中decode()与encode()方法可以接受参数,其声明分别为:

  bytes.decode(encoding="utf-8", errors="strict")

  str.encode(encoding="utf-8", errors="strict")

其中的encoding是指在解码编码过程中使用的编码格式,errors是指错误的处理方案。

注意:

  strict:表示严格按照指定编解码方式进行编码和解码,如果编解码不成功则崩溃

  ignore:表示忽略编解码不成功的字符,如果编解码不成功程序不会崩溃

9.udp绑定端口号

<1>绑定信息

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定

但如果需要做成一个服务器端的程序的话,是需要绑定的

一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口号绑定

<2>绑定示例

#coding=utf-8

from socket import *

# 1. 创建套接字

udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配

#  ip地址和端口号,ip一般不用写,表示本机的任何一个ip

local_addr = ('', 7788)

udp_socket.bind(local_addr)

# 3. 等待接收对方发送的数据

recv_data = udp_socket.recvfrom(1024) #  1024表示本次接收的最大字节数

# 4. 显示接收到的数据

print(recv_data[0].decode('gbk'))

# 5. 关闭套接字

udp_socket.close()

总结

一个udp网络程序,不绑定端口号,此时操作系统会随机分配一个端口号,如果绑定端口号,每次启动程序端口号不变。

10.UDP发送广播消息

参考代码

import socket

if __name__ == '__main__':

    # 创建udpsocket

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 设置socket的选项,允许发送广播消息

    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)

    # 发送广播消息

    udp_socket.sendto("大家好,我叫小郭同学,多多关照!".encode("gbk"), ("255.255.255.255", 9090))

    # 关闭socket

    udp_socket.close()

总结

  广播地址最常用的是255.255.255.255 通用的广播地址,不区分网段

    192.168.14.255: 局域网内的广播地址

11.udp聊天器

目标

      能够写出udp聊天器功能程序

说明

  在一个电脑中编写1个程序,有2个功能

  1.获取键盘数据,并将其发送给对方

  2.接收数据并显示

  选择以上的2个功能调用

参考代码

import socket

def send_msg(udp_socket):

    """获取键盘数据,并将其发送给对方"""

    # 1. 从键盘输入数据

    msg = input("\n请输入要发送的数据:")

    # 2. 输入对方的ip地址

    dest_ip = input("\n请输入对方的ip地址:")

    # 3. 输入对方的port

    dest_port = int(input("\n请输入对方的port:"))

    # 4. 发送数据

    udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))

def recv_msg(udp_socket):

    """接收数据并显示"""

    # 1. 接收数据

    recv_msg = udp_socket.recvfrom(1024)

    # 2. 解码

    recv_ip = recv_msg[1]

    recv_msg = recv_msg[0].decode("utf-8")

    # 3. 显示接收到的数据

    print(">>>%s:%s" % (str(recv_ip), recv_msg))

def main():

    # 1. 创建套接字

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2. 绑定本地信息

    udp_socket.bind(("", 7890))

    while True:

        # 3. 选择功能

        print("="*30)

        print("1:发送消息")

        print("2:接收消息")

        print("="*30)

        op_num = input("请输入要操作的功能序号:")

        # 4. 根据选择调用相应的函数

        if op_num == "1":

            send_msg(udp_socket)

        elif op_num == "2":

            recv_msg(udp_socket)

        else:

            print("输入有误,请重新输入...")

if __name__ == "__main__":

    main()

 


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容