一、linux知识
1、ifconfig:查看主机的ip地址2、ping:测试远程主机连通性3、虚拟机网卡设置4、端口 二、python知识
1、编码和解码2、socket简介
2.1、创建socket2.2、socket应用-udp网络程序发送数据2.3、udp网络程序接收数据2.4、udp发送端绑定端口2.5、udp接收端绑定端口 3、udp广播4、udp聊天器
一、linux知识 1、ifconfig:查看主机的ip地址2、ping:测试远程主机连通性inet就是ipv4地址,inet6就是ipv6地址
3、虚拟机网卡设置ping用来检测网络是否正常,或者某台主机是否可以连接
| NAT模式 | 虚拟机跟物理主机共用网络 |
|---|---|
| bridged模式 | 虚拟机如同一台真实存在的计算机,会占用真实网段的一个ip,虚拟机能够获取局域网的ip地址 |
linux系统中的端口有65536个!范围为0-65535
端口是怎样分配的?
0-1023是我们不能操控的,1024-635535是我们可以操控的
分配规则分为知名端口和动态端口
知名端口:
知名端口就是众所周知的端口:范围从0-1023
| 常见协议及端口 | 协议的基本作用 |
|---|---|
| FTP(21) | 文件上传和下载 |
| SSH(22) | 安全的远程登录 |
| Telnet(23) | 远程登录 |
| dns(53) | 域名解析 |
| http(80) | 超文本传输 |
| pop3(110) | 邮件接收 |
| https(443) | 加密传输的https |
动态端口
动态端口的范围为1024-65535
之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配,用户也可以修改
netstat:可以用来查看有哪些端口
lsof:可以用来查看占用端口的服务是谁,lsof -i:端口号
文本总是unicode,由str类型来表示,二进制数据使用bytes来表示;
网络中数据的传输都是以二进制(字节码)的方式来进行的,所以我们需要通过对unicode字符串内容进行编码和解码才能达到数据传输的目的
在python中:
str-->bytes:encode编码,就是将字符串转换为字节码 bytes-->str:decode解码,就是将字节码转换为字符串
常用的编码方案有utf-8(万国码)和gbk(中文),encode和decode默认使用的就是utf-8
encode()和decode()方法可以接收参数
bytes.decode(encoding="utf-8",errors="strict") str.encode(encoding="utf-8",errors="ignore") errors指错误的处理方案,默认为strict,编码错误就会报错,ignore就是忽略错误2、socket简介
2.1、创建socket它能够实现不同主机之间的进程通信,我们网络上各种各样的服务大多数都是基于socket来完成通信的,例如我们每天浏览网页,qq聊天,收发email等。
socket是网络通信的基本单元,提供的方法可以实现数据的发送和接收
在Python中,使用socket模块的socket类就可以
import socket socket.socket(AddressFamily,Type)
2.2、socket应用-udp网络程序发送数据参数一:AdressFamily:地址簇
socket.AF_INET IPv4(默认)
socket.AF_INET6 IPv6
socket.AF_UNIX 只能够用于单一的unix系统进程间的通信
参数二:Type(类型)
socket.SOCK_STREAM 流式socket,for TCP(默认)
socket.SOCK_DGRAM 数据报式socket,for UDP
socket.SOCK_RAW 原始套接字,可以处理icmp,igmp等网络报文
socket.SOCK_SEQPACKET 可靠的连续数据包服务
实现代码如下:
#1、导入模块
import socket
# 2、创建套接字,使用ipv4,udp方式
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3、数据的传递
"""
sendto参数说明
参数1、数据必须是二进制数据,字符串.encode(),转换为二进制
参数2、元组类型,把参数1的数据发送给谁(ip地址字符串,端口数值)
"""
udp_socket.sendto("helloworld!".encode(),("192.168.150.30",8080))
# 4、关闭套接字
udp_socket.close()
效果如下,发送的地址为windows的地址
import socket
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#recvfrom(1024):从套接字中接收1024字节的数据,此方法会造成程序的阻塞
#如果对方发送了数据,recvfrom会自动接触阻塞,如果没有发送数据,会一直等待
recv_data=udp_socket.recvfrom(1024)
recv_text=recv_data[0].decode()
print("来自:",recv_data[1],"的消息",recv_text)
2.4、udp发送端绑定端口
在发送和接收信息的时候,端口会一直变化,所以我们需要绑定端口
实现代码如下:
import socket
#创建套接字
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定端口:udp_socket.bind(adress),adress是一个元组,元组的第一个元素是字符串类型的ip地址,第二个元素是整数端口号
udp_socket.bind(("192.168.150.25",8888)) #这里的IP地址是自己的ip地址
#发送数据
udp_socket.sendto("hello".encode(),("192.168.150.30",8080))
udp_socket.close()
效果如下:
"""
1、导入模块
2、创建套接字
3、绑定端口
4、接收对方发送的数据
5、解码数据
6、输出显示
7、关闭套接字
"""
import socket
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_socket.bind("",6666)#ip可以写为空,默认就是本机ip,如果有多个网卡,会监听所有的网卡
#接收对方发送的数据
recv_data,ip_and_port=udp_socket.recvfrom(1024)
#解码数据并数出显示
print("接收{}的信息{}".format(str(ip_and_port,recv_data.decode())))
udp_socket.close()
3、udp广播
广播地址是专门用于同时向网络中所有工作站进行发送的一个地址,255.255.255.255即是广播地址,所以向255.255.255.255发送消息,就是发送广播消息
实现代码如下:
"""
1、导入模块
2、创建套接字
3、设置广播权限
4、发送数据
5、关闭套接字
"""
# 1、导入模块
import socket
# 2、创建套接字
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3、设置广播权限
#套接字默认不允许发送广播,需要开启相关权限
#udp_socket.setsockopt(套接字,属性,属性值)
#socket.SOL_SOCKET当前的套接字,socket.SO_BROADCAST广播属性,默认值为False,要设置为True,为可以发送广播
udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,True)
# 4、发送数据
udp_socket.sendto("hello".encode(),("255.255.255.255",8080))
# 5、关闭套接字
udp_socket.close()
注意:广播地址也可以写某一个网段.255,一个局域网内的主机就会收到消息,需要安装网络助手才能收到消息哦
如若我们不设置广播权限运行代码,就会出现如下错误
说明:
1、在电脑中编写一个程序,实现三个功能
2、获取键盘数据,并将其发送给对方
3、接收数据并且显示
4、退出聊天系统



