七 网络通信
- 93.网络通信概述
- 94.IP地址
- 95.Linux、windows查看网卡信息
- 96.ipv4和ipv6
- 97.端口
- 98.端口分类:知名端口和动态端口
- 99.socket介绍
- 100.udp发送数据
- 101.关闭虚拟机的虚拟网卡
- 102.运行python程序
- 103.接受udp数据
- 104.端口绑定的问题
- 105.重要概念
- 106.输入对方的ip、port、全双工、半双工
- 107.案例:udp聊天器
- 108.tcp介绍
- 109.tcp客户端
- 110.tcp服务器
- 111.案例:下载文件
- 112.liten里的参数
- 113.多任务介绍、以及线程的基本使用
93.网络通信概述
通过网络互相通信
94.IP地址
在互联网上的唯一标识
95.Linux、windows查看网卡信息
Linux
ifconfig
关闭网卡
sudo ifconfig ensxxx down
开启
sudo ifconfig ensxxx up
Windows
ipconfig
96.ipv4和ipv6
ipv4:
ipv6:
97.端口
端口(port)确定机器上的进程
98.端口分类:知名端口和动态端口
Linux中有65536个端口
知名端口
0-1023
80:HTTP
21:FTP
动态端口
1024-65535
查看端口
netstat -an # 查看端口状态
99.socket介绍
Tocket:套接字===ip+端口
具体就是ip+协议+端口
进程间的通信就是数据共享
- 创建socket
在python中使用socket模块的函数socket就可以完成
import socket
socket.socket(AddressFamily,Type)
说明:
函数socket.socket创建一个socket,该函数带有两个函数:
- Address Family:可以选择AF_INET(用于Internet 进程间的通信)或者AF_UNIX (用于同一台机器进程间的通信),实际工作中常用AF_INET
- Type:套接字类型,可以是SOCKET_STREAM(流式套接字,主要用于TCP协议)或者SOCKET_DGRAM (数据包套接字,主要用于UDP协议)
创建一个tcp socket (tcp套接字)
import socket
# 创建tcp套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 使用套接字功能
# 关闭
s.close()
创建一个udp socket (udp套接字)
import socket
# 创建udp套接字
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 使用套接字功能
# 关闭
s.close()
滑稽:lua语言写外挂的
vim语法:
V+上下
shift+< 进行缩进
100.udp发送数据
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("请输入要发送的数据:")
# udp_socket.senddto(b"hehe",dest_addr) # 发送数据必须为bytes
# 4. 发送数据到指定的电脑上的指定程序
udp_socket.sendto(send_data.encode('utf-8'),dest_addr)
# 5.关闭套接字
udp_socket.close()
在桥接模式下
输入以下命令sudo dhclient
得到一个局域网的ip
101.关闭虚拟机的虚拟网卡
virtual开头的网关了
102.运行python程序
ipython
循环发送
import socket
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.接收方地址
# ‘192.168.1.103’表示目的ip地址
# 8080表示端口
dest_addr = ('182.92.82.121', 7788) # 注意是是元组,ip是字符串,端口是数字
while True:
# 3.从键盘上获取数据
send_data = input("请输入要发送的数据:")
# udp_socket.senddto(b"hehe",dest_addr) # 发送数据必须为bytes
# 4. 发送数据到指定的电脑上的指定程序
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5.关闭套接字
udp_socket.close()
带退出的发送数据
import socket
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.接收方地址
# ‘192.168.1.103’表示目的ip地址
# 8080表示端口
dest_addr = ('182.92.82.121', 7788) # 注意是是元组,ip是字符串,端口是数字
while True:
# 3.从键盘上获取数据
send_data = input("请输入要发送的数据:")
# udp_socket.senddto(b"hehe",dest_addr) # 发送数据必须为bytes
# 4. 发送数据到指定的电脑上的指定程序
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5.关闭套接字
udp_socket.close()
103.接受udp数据
from socket import *
# 1.创建套接字
udp_socket=socket(AF_INET,SOCK_DGRAM)
# 2.绑定本地相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr=('',7788) # ip地址和端口号,ip一般不写,表示本机的任何一个ip
udp_socket.bind(local_addr)
# 3.等待接收对方发送的数据
recv_data=udp_socket.recvfrom(1024) # 表示本次接收的最大字节数
# 4.显示接受到的数据
print(recv_data[0].decode('gbk'))
# 前面省略,从下面直奔主题,举个代码例子:
result2txt=str(recv_data[0].decode('gbk')) # data是前面运行出的数据,先将其转为字符串才能写入
with open('结果存放.txt','a') as file_handle: # .txt可以不自己新建,代码会自动新建
file_handle.write(result2txt) # 写入
file_handle.write('\n') # 有时放在循环里面需要自动转行,不然会覆盖上一条数据
# 5.关闭套接字
udp_socket.close()
循环接受并打印
from socket import *
# 1.创建套接字
udp_socket=socket(AF_INET,SOCK_DGRAM)
# 2.绑定本地相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr=('',7788) # ip地址和端口号,ip一般不写,表示本机的任何一个ip
udp_socket.bind(local_addr)
while True:
# 3.等待接收对方发送的数据
recv_data=udp_socket.recvfrom(1024) # 表示本次接收的最大字节数
# 4.显示接受到的数据
print(recv_data[0].decode('gbk'))
print(recv_data)
# 前面省略,从下面直奔主题,举个代码例子:
result2txt=str(recv_data[0].decode('gbk')) # data是前面运行出的数据,先将其转为字符串才能写入
with open('结果存放.txt','a') as file_handle: # .txt可以不自己新建,代码会自动新建
file_handle.write(result2txt) # 写入
file_handle.write('\n') # 有时放在循环里面需要自动转行,不然会覆盖上一条数据
104.端口绑定的问题
发送数据的进程发送数据时会被主机随机分配一个随机端口(在没有绑定固定端口时)
发送程序绑定端口
import socket
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.接收方地址
# ‘192.168.1.103’表示目的ip地址
# 8080表示端口
udp_socket.bind("",7890)
dest_addr = ('182.92.82.121', 7788) # 注意是是元组,ip是字符串,端口是数字
while True:
# 3.从键盘上获取数据
send_data = input("请输入要发送的数据:")
# udp_socket.senddto(b"hehe",dest_addr) # 发送数据必须为bytes
# 4. 发送数据到指定的电脑上的指定程序
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5.关闭套接字
udp_socket.close()
不同进程不可以占用同一端口
105.重要概念
私有ip不能上网
106.输入对方的ip、port、全双工、半双工
行数+G :vi跳行
A:行末
给自己进程发信息IP为:127.0.0.1
recvfrom受不到信息,会卡住
import socket
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.接收方地址
# ‘192.168.1.103’表示目的ip地址
# 8080表示端口
dest_ip=input("输入ip")
dest_port=int(input("输入port"))
udp_socket.bind("",7890)
dest_addr = (dest_ip, dest_port) # 注意是是元组,ip是字符串,端口是数字
# 3.从键盘上获取数据
send_data = input("请输入要发送的数据:")
# udp_socket.senddto(b"hehe",dest_addr) # 发送数据必须为bytes
# 4. 发送数据到指定的电脑上的指定程序
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 套接字可以同时收发
recv_data=udp_socket.recv_from(1024)
print(recv_data)
# 5.关闭套接字
udp_socket.close()
单工:只可以发或收
半双工:可以收发,但不能同时
全双工:可以同时收发
socket:是全双工的