七 网络通信

七 网络通信

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+协议+端口

进程间的通信就是数据共享

  1. 创建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:是全双工的

107.案例:udp聊天器

108.tcp介绍

109.tcp客户端

tcp服务器

案例:下载文件

liten里的参数

发布了1031 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41375318/article/details/104549434