IP
Linux
常用命令
查看网卡:ifconfig
关闭网卡:sudo ifconfig ens33 down
关闭网卡:sudo ifconfig ens33 up
重置IP地址:sudo dhclient
注:ens33 根据Ubuntu版本不同而不同,ifconfig查看
(桥接:同一个局域网时使用)
Windows
查看IP
1.cmd
2.网络适配器
3.shift+右键->powershell
IP地址的分类
IP种类
ipv4:四组0~255(不包含0及255)组成
示例:192.168.11.2
ipv6:新版ip,但尚未大量使用
示例:fe80::13d6:1520:a4a5:2aeb/64 Scope:Link
IP分类
D类:用于多点广播,多点⼴播地址⽤来⼀次寻址⼀组计算机
E类:仅作试验和开发用
私有类:局域网,私网IP
本地回环:自己电脑使用
注:
目的ip:dest ip
源ip:src ip
端口
端口即应用服务程序的路径
端口号
端⼝是通过端⼝号来标记的,端⼝号只有整数,范围是从0到65535
知名端口(Well Known Ports)
知名端⼝是众所周知的端⼝号,范围从0到1023。例如:80端⼝分配给HTTP服务;21端⼝分配给FTP服务。
动态端⼝(Dynamic Ports)
动态端⼝的范围是从1024到65535。
动态端⼝不固定分配某种服务,⽽是动态分配。动态分配是指当⼀个系统程序或应⽤程序程序需要⽹络通信时,它向主机申请⼀个端⼝,主机从可⽤的端⼝号中分配⼀个供它使⽤。当这个程序关闭时,同时也就释放了所占⽤的端⼝号。
socket及udp
socket(简称 套接字 ) 是进程间通信的⼀种方式,能实现不同主机间的进程间通信。利⽤ip地址,协议,端⼝标识⽹络的进程,并交互。
注:udp、tcp都属于协议
udp通信
发信息
import socket
def main():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定本地信息
udp_socket.bind(("",7788))
while True:
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 如果输入的数据是exit,那么就退出程序
if send_data == "exit":
break
# 使用套接字收发数据
# udp_socket.sendto(b"消息",对方的ip以及端口port)
# udp_socket.sendto(b"hahaha",("192.168.11.96",8080))
udp_socket.sendto(send_data.encode("utf-8"),("192.168.11.96",8080))
# 关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
注:
socket.AF_INET:ipv4
socket.SOCK_DGRAM:嵌套字类型udp
socket.SOCK_STREAM:嵌套字类型tcp
send_data.encode(“utf-8”)
encode编码(转成字节)
utf-8 Ubuntu发出信息时转码
收信息
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定一个本地信息
localaddr = ("",7788)
udp_socket.bind(localaddr) # 绑定自己电脑的ip和port。
while True:
# 接收数据
recv_data = udp_socket.recvfrom(1024)
# recv_data这个变量中储存的是一个元组(接收到的数据,(发送方的ip,端口port))
recv_msg = recv_data[0] # 储存接收到的数据
send_addr = recv_data[1] # 储存发送方的地址信息
# 打印接收到的数据
# print(recv_data)
print("%s:%s" % (str(send_addr),recv_msg.decode("gbk")))
# 关闭套接字
udp_socket.close()
if __name__ =="__main__":
main()
注:
recv_data.decode(“gbk”)
decode解码(转成字符)
gbk Windows发出信息时转码
udp聊天器
import socket
def send_msg(udp_socket):
"""获取键盘数据,并将其发送给对⽅"""
# 1. 从键盘输⼊数据
msg = input("\n请输⼊要发送的数据:")
# 2. 输⼊对⽅的ip地址
dest_ip = input("\n请输⼊对⽅的ip地址:")
# 3. 输⼊对⽅的port
dest_port = int(input("\n请输⼊对⽅的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("输⼊有误,请重新输⼊...")
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
udp聊天器实现过程