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()

python123.io同一个号可以同时在不同设备登陆吗-Python 高级 3相关推荐

  1. python123.io同一个号可以同时在不同设备登陆吗-ITech8 - 合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下!...

    go1.11.1 依赖包管理 go mod 总结 查看go版本: itech8 :: ~ » go version go version go1.11.1 darwin/amd64 module机制由 ...

  2. 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

    目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...

  3. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备

    一.引言 很久前接触linux驱动就知道主设备号找驱动,次设备号找设备.这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理: 二.Linux内核主次设备号的管理 Li ...

  4. QQ号转换成16进制登陆

    QQ号转换成16进制登陆 闲来无事,把自己的QQ号码进行进制转换,以十进制转换成十六进制进行登陆 很好玩,可以拿来装逼 在线进行转换链接 登陆的时候需要在十六进制之前加上 0x,然后进行登陆,完全没毛 ...

  5. 国际会计准则第16号--不动产、厂房和设备

    国际会计准则第16号--不动产.厂房和设备 2006-09-02   来源:中国会计网   作者:   参与讨论:会计论坛 (1993年12月修订) 目的 本号准则的目的是规定不动产.厂房和设备的会计 ...

  6. Linux驱动开发之主设备号找驱动,次设备号找设备

    原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8805179,作者:gqb666 一.引言   最近成都地 ...

  7. 内核怎么通过主设备号找驱动、次设备号找设备

    之前看韦东山老师视频,说到linux驱动就知道主设备号找驱动,次设备号找设备.这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理.在内核中,dev_t  类型( 在 ...

  8. python123 io平台-Java Review(三十六、IO)

    Java 的 IO 通过 java.io 包下的类和接口来支持, 在 java.io 包下主要包括输入. 输出两种 10 流, 每种输入. 输出流又可分为字节流和字符流两大类. 其中字节流以字节为单位 ...

  9. python123.io作业_Python自动化开发学习3

    函数 通过函数,可以定义一段代码块,之后通过函数名可以反复调用 定义一个函数:def alert(): "打印Hello World" print("Hello Worl ...

最新文章

  1. JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书
  2. PHP参数会被用作对象名
  3. 【CI】CN.一种多尺度协同变异的微粒群优化算法
  4. Microsoft Visual Studio 打开代码出现乱码解决方案
  5. python Box-Cox数据变化与逆变化
  6. Redis Cluster部署、管理和测试
  7. Elasticsearch 嵌套类型nested
  8. 使用篇-基于Laravel开发博客应用系列 —— 联系我们 发送邮件 队列使用(基于数据库)...
  9. 网站服务器一般是多少宽带,服务器宽带一般是多少
  10. 对类型“H12.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常。
  11. BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索
  12. git version可以卸载吗_「玩转Git命令」作为代码奴,该安装Git啦
  13. 高通QCA9531方案定制开发主板300M 2.4G无线模块面板AP wifi路由模块 用的是什么网络变压器
  14. 素描正确握笔的姿势是怎么样的?
  15. (转)实用Word使用技巧大全
  16. xenserver安装配置
  17. atof(),atoi(),itoa(),sprintf()等用法总结
  18. 基于构件技术的流程银行,再造核心竞争力
  19. iOS MRC下的setter方法
  20. Masterboxan INC智能化资产配置模式上线,全方位提升数字化金融服务

热门文章

  1. css规则定义的分类,CSS规则定义英汉对照表
  2. 数字创意产业定义与研究范围
  3. 根据历史数据预测未来数据_速递!从真实世界到未来预测,从ESC最新研究数据看SPC降压地位...
  4. 在跑SC-LEGO-LOAM时报错[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloude
  5. 2022年4月13日记
  6. Microsoft Defender SmartScreen 阻止了无法识别的应用启动,Windows已阻止此软件和无法验证发布者两个问题的解决方法(以腾讯云服务器为例的三种保姆级图文解决方法)
  7. 使用Navicat远程连接oracle数据库
  8. basic计算机编程基础,QBASIC编程语言基础
  9. html名人名言页面,网页制作:关于生命的名言警句 ― 名人名言  一品故事网,Www.07938.Come...
  10. m73p黑苹果_现阶段最便宜的完美黑苹果配置是什么?