Python网络编程 —— IP、UDP
Python网络编程 —— IP、UDP
IP
ip地址: 在网络中标识一台唯一的设备
ip地址的作用: 通过ip地址在网络中找到对应的设备,然后可以给这个设备发送数据
ip地址分为:ipv4 ipv6
域名:方便记忆某台电脑的主机地址,域名能解析出来一个ip地址(DNS解析)
ping 127.0.0.1 能ping通即代表电脑网卡没有问题,网络正常就能上网
网络通信流程:
通过ip地址找到对应的设备(电脑,手机等),然后通过端口号找到端口,再通过端口给应用程序发送数据
端口号分为知名端口号和动态端口号(知名端口号是系统使用的,动态端口号是程序员设置使用的)
知名端口号:范围从0-1023
动态端口范围:1024-65535 ,当程序关闭时,同时也就释放了所占用的端口号
查看端口号:netstat -an
查看端口号被哪个程序占用: lsof -i[tcp/udp]:端口号 (找不到时,使用管理员权限,加sudo)
根据进程编号杀死指定进程:kill -9 进程号
UDP
概念:英文全拼(User Datagram Protocol)简称用户数据报协议,它是无连接的、不可靠的网络传输协议
面向无连接型:无需确认对端是否存在,发送端可随时发送数据(udp网络传输协议好比现实生活中写信)
UDP特点:
无连接、资源开销小、传输速度快、UDP每个数据包最大是64K
UDP优点:
传输速度快
不需要连接,资源开销小
UDP缺点:
传输数据不可靠,容易丢失数据包
没有流量控制,当对方没有及时接收数据,发送方一直发送数据会导致缓冲区数据满了,电脑出现卡死情况,所以接收方需要及时接收数据
socket
进程:运行的程序或者软件称之为进程
进程通信:运行的程序之间的数据共享
socket:简称:套接字,是进程间通信的一个工具,它能实现把数据从一方传输到另外一方,完成不同电脑上进程之间的通信
使用场景:只要和网络相关,几乎都需要使用socket
UDP网络程序
UDP网络程序流程
1.创建socket套接字
2.发送/接收数据
3.关闭套接字
创建socket 发送数据
在Python中使用socket模块的函数socket
import socket # 判断是否是主模块,判断是否是程序入口 if __name__ == "__main__": # 创建UDP套接字 # 1. ip地址的类型:AF_INET: ipv4, AF_INET6: ipv6 # 2. 传输协议类型:SOCK_DGRAM:udp协议 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 准备数据 send_content = "学习socket,很开心" # 把字符串编码成为二进制数据 send_data = send_content.encode("utf-8") # 发送数据 udp_socket.sendto(send_data,('192.168.138.50',8080)) # 关闭套接字 udp_socket.close()
创建socket 接收数据
import socket if __name__ == "__main__": # 创建udp套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 准备发送的数据 send_content = "测试测试" # 对数据进行编码,把字符串转成对应的二进制数据 send_data = send_content.encode("gbk") # 发送数据 udp_socket.sendto(sned_data,("192.168.138.50", 8080)) # 接受数据,1024表示:每次接收数据的最大字节数 recv_data, ip_port = udp_socket.recvfrom(1024) # 对二进制数据进行解码 # sep : 指定数据的分隔符 recv_content = recv_data.decode("gbk") print(recv_content, ip_port, sep="&") # 关闭 udp_socket.close()
udp绑定端口号
udp 绑定信息:一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定
但是如果需要做成一个服务端的程序的话,是需要绑定的
绑定端口号:
import socket if __name__ == "__main__": # 创建udp套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 绑定端口号, "" : 表示本机的任意IP地址,可以解决电脑上多个网卡都能收到数据 udp_socket.bind("", 9090) # 发送数据 udp_socket.sendto("哈哈".encode("gbk"),("192.168.138.50", 8080)) # 接收数据 recv_data, ip_port = udp_socket.recvfrom(1024) # 把二进制数据进行解码 recv_content = recv_data.decode("gbk") print(recv_content, ip_port) # 关闭套接字 udp_socket.close()
UDP 发送广播消息
import socket if __name__ == "__main__": # 创建udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 1.SQL_SOCKET:当前套接字 # 2.SO_BROADCAST :广播选项 # 3.True :是否开启广播选项 udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) # 发送数据 udp_socket.sendto("你好".encode("gbk"), ("192.168.138.50", 8989)) # 关闭套接字
udp 聊天器
需求:
在一个电脑中编写一个程序,有两个功能
1.获取键盘数据,并将其发送给对方
2.接受数据并显示
import socket if __name__ == "__main__": # 创建udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 接收用户的功能选项 menu_option = input("请输入功能选项 1.发送数据 2.接收数据 3.退出:") while True: if menu_option == "1": # 获取用户发送的数据 send_content = input("请求输入您要发送的数据:") # 获取对方的IP地址 dest_ip = input("请输入对方的ip地址:") # 获取对方的端口号 dest_port = input("请输入对方的端口号:") # 把字符串进行gbk编码 send_data = send_content.encode("gbk") # 发送数据 udp_socket.sendto(send_data,(dest_ip,int(dest_port))) elif menu_option == "2": # 接收数据 recv_data, ip_port = udp_socket.recvfrom(1024) # 对二进制数据进行解码 recv_content = recv_data.decode("gbk") print(recv_content, ip_port) elif menu_option == "3": break else: print("请按提示操作!") # 关闭套接字 udp_socket.close()
欢迎访问
个人博客地址:www.limiao.tech
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python 正则表达式(regex)
Python 正则表达式(regex) 正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑 正则表达式非Python独有,在Python中使用re模块实现 常见匹配模式 模式 描述 \w 匹配数字、字母、下划线 \W 匹配非数字、字母、下划线 \s 匹配任意空白字符,等价于[\t\n\r\f] \S 匹配任意非空字符 \d 匹配任意数字,等价于[0-9] \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 \z 匹配字符串结束 \G 匹配最后匹配完成的位置 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配字符串的开头 $ 匹配字符串的末尾 . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 [...] 用来表示一组字符,单独列出:[abc]匹配"a","b"或"c" [^...] 不再[]中的字符:[^abc]匹配除了a,b,c之外的字符 * 匹配0个或...
- 下一篇
Java中的路径问题
java中路径问题看似不大,但是有时候细节问题导致的是 当前路径不存在 常常伴随左右。来总结一下路径问题吧。 路径不存在: 首先必须注意的是 如果FileInputStream中的路径如果不存在的话,就会报错,如果路径存在而文件不存在 就会创建对应的文件。 /代表位置 分两种情况:目标资源是给谁使用的。 给服务器使用的: / 表示在当前web应用的根目录(webRoot 给浏览器使用的: / 表示在webapps的根目录下 举例:转发:就是服务器调用,就是内部调用,/代表当前项目: request.getRequestDispatcher("/target.html") .forward(request, response); 请求重定向:就是浏览器调用。 response.sendRedirect("/day11/target.html"); html页面的超连接href:浏览器调用。 response.getWriter().write("<html><body><a href= '/day11/target.html'>超链接</a>...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题