IP
在一个局域网内,一个IP标记一台唯一的设备;
端口
在一台电脑中一个应用程序占用一个端口;
端口号的取值:0-65535
端口分为知名端口和动态端口;
知名端口号:0-1024
socket简介
用于网络通信必备的工具,在今天的所有网络通信的应用都是使用socket实现的;
socket的一般语法:
socket(socket_family, socket_type, protocol=0)
参数说明:
socket_family: AF_UNIX(用于Internet进程间通信)
AF_INET(用于同一台机器进程间的通信)
socket_type: SOCK_STREAM(流式套接字,主要用于TCP协议)
SOCK_DGRAM(数据报套接字,主要用于UDP协议)
protocal: 通常省略,默认为0
创建一个TCP socket
import socket
# 创建tcp的套接字
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# 使用套接字的功能
# 关闭套接字
s.close()
创建一个UDP socket
import socket
# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 使用套接字的功能
# 关闭套接字
s.close()
一个发送数据的UDP端口
import socket
# 创建套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 操作套接字
send_data = input("请输入:")
udp_socket.sendto(send_data.encode("utf-8"), ("192.168.70.60", 8080))
# 关闭套接字
udp_socket.close()
一个接收数据的UDP端口
import socket
# 创建套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ("", 7788) # IP地址和端口号,IP一般不写,表示本机的任何一个IP
udp_socket.bind(local_addr)
# 接收数据
receive_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 返回值recv_data的结构是:(接受到的bytes类型数据, (消息发送方的IP地址, 发送方的端口号))
# 显示接收到的数据
receive_msg = receive_data[0].decode("gbk")
print(receive_msg)
# 关闭套接字
udp_socket.close()
使用UDP协议在同一个套接字实现信息的收发
import socket
# 创建套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
local_addr = ("", 8888) # IP地址和端口号,IP一般不写,表示本机的任何一个IP
udp_socket.bind(local_addr)
# 操作套接字
while True:
# 发送消息
dest_ip = input("请输入对方的IP:")
dest_port = int(input("请输入对方端口:"))
send_data = input("请输入要发送的信息:")
udp_socket.sendto(send_data.encode("gbk"), (dest_ip, dest_port))
# 接收信息
receive_msg = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
print(receive_msg)
# 关闭套接字
udp_socket.close()
使用TCP协议发送信息(服务器)
import socket
# 创建socket
tcp_cilent_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 目的信息
server_ip = input("请输入服务器IP:")
server_port = int(input("请输入服务器端口:"))
# 链接服务器
tcp_cilent_socket.connect((server_ip, server_port))
# 提示用户输入数据
send_data = input("请输入要发送的数据:")
# 发送数据
tcp_cilent_socket.send(send_data.encode("gbk"))
# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_cilent_socket.recv(1024)
print(recvData)
# 关闭套接字
tcp_cilent_socket.close()
文件下载器
客户端
import socket
# 创建socket
tcp_cilent_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取服务器ip,port
dest_ip = input("请输入下载服务器的ip:")
dest_ip_port = int(input("请输入下载服务器的port:"))
# 链接服务器
tcp_cilent_socket.connect((dest_ip, dest_ip_port))
# 获取下载文件名字
download_file_name = input("请输入要下载的文件名字:")
# 将文件名发送到服务器
tcp_cilent_socket.send(download_file_name.encode("utf-8"))
# 接收文件中的数据
recv_date = tcp_cilent_socket.recv(1024)
# 保存收到的数据到一个文件中
with open(download_file_name, "wb") as f:
f.write(recv_date)
# 关闭套接字
tcp_cilent_socket.close()