因为之前在Java课上学过网络编程,所以在此不做详细介绍,本文主要用来为单片机通信打基础,所以可能写的比较粗糙。
目录
主要就是创建套接字,然后准备对方的IP地址和端口号,不清楚自己端口号的可以到C运行里面输入 cmd /k ipconfig,这样就可以找到自己的端口号了,之后获取需要传输的数据,发送,接收,再关闭套接字就好了。
from socket import *
# 创建UDP套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 准备接收方的地址
addr = ('192.168.190.1', 8080)
# 获取数据
send_data = input("你要传输的数据为:")
# 发送
udp_socket.sendto(send_data.encode('utf-8'), addr)
# 接收
recv_data = udp_socket.recvfrom(1024)
# 显示对方发送的数据
# 第一个是数据,第二个是端口号
print(recv_data[0].decode('utf-8'))
print(recv_data[1])
# 关闭
udp_socket.close()
在我们的网络调试助手里面我们能够清晰的发现,我们的端口号每次都会变,所以我们需要去绑定端口号。
from socket import *
# 创建UDP套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 绑定信息
local_addr = ('', 7788)
udp_socket.bind(local_addr)
# 接收
recv_data = udp_socket.recvfrom(1024)
# 显示对方发送的数据
# 第一个是数据,第二个是端口号
print(recv_data[0].decode('utf-8'))
print(recv_data[1])
# 关闭
udp_socket.close()
这样端口号就不会乱变来变去了。
socket只需要发送1次UDP数据,就可以发送给本局域网中的任何一台电脑发送相同的数据
import socket
# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# # 绑定信息
local_addr = ('', 7788)
udp_socket.bind(local_addr)
# 广播
dest_info = ("<broadcast>", 8080)
udp_socket.sendto('xiaocy'.encode('utf-8'), dest_info)
# 关闭
udp_socket.close()
TCP相对于UDP来说相对稳定一点,但是也复杂一点,接下来我们就来简单介绍一下。
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
from socket import *
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 链接服务器
tcp_client_socket.connect(("192.168.190.1", 8080))
# 提示用户输入数据
send_data = input("请输入要发送的数据:")
# 向服务器发送数据
tcp_client_socket.send(send_data.encode("utf-8"))
# 接收数据
recv_content = tcp_client_socket.recv(1024)
print(recv_content.decode("utf-8"))
# 关闭套接字
tcp_client_socket.close()
import socket
# 创建TCP套接字
server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定本地信息
server_s.bind(("", 7788))
# 设置为被动的
server_s.listen(128)
# 等待客户端链接
new_s, client_info = server_s.accept()
# 用新的套接字为已经连接好的客户端服务器
while True:
recv_content = new_s.recv(1024)
print("%s>>>%s" % (str(client_info), recv_content.decode("utf-8")))
if not recv_content:
# 当客户端调用了close后,recv返回值为空,此时服务套接字就可以close了
# 关闭服务套接字
new_s.close()
break
# 关闭监听套接字
server_s.close()
三次握手
四次握手