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(" 请输入要发送的数据:")
# 2. 输入对方的ip地址
dest_ip = input(" 请输入对方的ip地址:")
# 3. 输入对方的port
dest_port = int(input(" 请输入对方的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()