一、udp通信
udp 不需要经过3次握手和4次挥手,不需要提前建立连接,直接发数据就行。
UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。
UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对方。所以UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。
注:若Linux 与 Windows 通信不能ping通时,需要将Linux虚机改为桥接模式。
udp通信中,服务器客户端通信流程:
1、Windows与Linux通信(udp)
注:使用网络助手测试,下载链接:链接:https://pan.baidu.com/s/1qWNImiRlbWi11rqLka8jBg 提取码:7ers
若Windows中出现多个ip地址时,是因为安装了VMware,出现了多个虚拟网卡,此时关闭VMware的虚拟网卡即可
2、udp循环收发数据
注:接收、发送数据要做到统一,需要绑定端口号(bind)
(1)接收数据
import socket
def recv():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr_tuple = ("", 8888)
#绑定一个本地信息
udp_socket.bind(addr_tuple)
while(True):
#1024表示本次接收的最大字节数
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0] #存储接收的数据
send_addr = recv_data[1] #存储发送方的地址信息
print("%s : %s" % (str(send_addr), recv_msg.decode('gbk')))
udp_socket.close()
return None
if __name__ == '__main__':
recv()
(2)发送数据
import socket
def main():
"""
socket使用
:return: None
"""
#创建一个udp socket
udp_socet = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dest_addr = ('192.168.0.154', 8080)
while(True):
# 可以使用套接字收发数据
send_data = input("请输入需要传输的内容:")
if send_data == "exit":
break
else:
# encode指定字符编码
udp_socet.sendto(send_data.encode("gbk"), dest_addr)
#关闭socket
udp_socet.close()
return None
if __name__ == '__main__':
main()
二、Windows Deepin Ubuntu 系统均可以使用的网络调试助手-mNetAssist
1.UDP通讯;
2.可做 TCP客户端;
3.可做 TCP服务器;
4.可以“十六进制”传送接收数据;
5.可以传送和接收数据文件;
6.TCP服务器模式时支持群聊模式;
7.支持中文;
1、在Ubuntu下的安装
- 将mNetAssist-release-amd64.deb文件放到Ubuntu中
- 使用终端安装:sudo dpkg -i mNetAssist-release-amd64.deb
- 在Ubuntu左上角搜索 “网络调试助手”,单击运行
三、udp聊天室
注:套接字是可以同时收发数据的。(socket是全双工的)
目前是发送后,才可以接受,做成了半双工。socket本身是全双工的,需要借助多任务操作来实现。
import socket
def sendMsg(udp_socket):
"""
发送消息
:return:None
"""
# 发送
# 获取要发送的内容
dest_ip = input("请输入对方的ip:")
dest_port = int(input("请输入对方的port:"))
send_data = input("请输入要发送的消息:")
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
return None
def recvMsg(udp_socket):
"""
接收数据
:return:None
"""
# 接受并显示
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
return None
def main():
#创建socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#绑定信息
udp_socket.bind(("", 7788))
#循环来进行事情处理
while True:
print("------聊天室------")
print("---1、发送消息-----")
print("---2、接收消息-----")
print("---0、退出系统-----")
op = input("请选择功能:")
if op == "1":
#发送
sendMsg(udp_socket)
elif op == "2":
#接收并显示
recvMsg(udp_socket)
elif op == "0":
break
else:
print("输入有误,请重新输入!!!")
return None
if __name__ == '__main__':
main()