python udp tcp,python接收udp数据

  python udp tcp,python接收udp数据

  本文主要介绍了如何使用python实现UDP通信,具有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。

  

目录
python UDP通信UDP协议的理解Socket UDP的介绍UDP的特点UDP中客户端与服务器的交互UDP网络通信过程UDP中多线程聊天室广播中服务器的实现

  

python UDP通信

  1.打开虚拟通信程序,选择UDP通信,选择发送和接收数据的ip地址port端口:

  2.在虚拟机中编写python程序,在主机中用虚拟通信程序实现数据传输:

  # annotation的注释格式是:在每一行的开头,直接输入#并留出空格开始注释。

  #如果您在每行代码后添加注释,请输入两个空格#然后输入一个空格开始注释。

  导入插座

  #使用udp发送和接收数据

  定义主():

  # 1.创建套接字套接字

  UDP _ socket=socket . socket(socket . af _ inet,sock。SOCK_DGRAM) # af _ inet表示使用ipv4,默认不变,SOCK_DGRAM表示使用UDP通信协议。

  # 2.绑定端口

  Local_addr=( ,7878) #默认为本地计算机的任意ip,端口号为7878。

  Udp_socket.bind(local_addr) #绑定端口

  # 3.发送和接收数据

  Send_data=input(请输入您要发送的数据:)

  UDP _ socket . send to(send _ data . encode( UTF-8 ),( 10.80.34.68 ,8080)) #编码成全球统一的数据格式,接收方的ip和端口用元组表示。

  recv _ data=UDP _ socket . recvfrom(1024)#定义一次接收的最大字节数。

  # 4.打印数据

  Recv_msg=recv_data[0] #接收到的元组形式的数据有两个元素,第一个是发送信息。

  Send_addr=recv_data[1] #元组的第二个元素是发送方的ip和端口。

  Print(收到的消息是:,recv _ msg . decode( gbk )#默认情况下,使用“gbk”对windows发送的数据进行解码,确保汉字不乱码。

  Print(发件人地址是:,str(send_addr)) #被强转换为字符串输出地址,以确保它不是乱码。

  # 5.关闭插座

  udp_socket.close()

  if __name__==__main__:

  主()

  

对UDP协议的理解

  

Socket简介

  网络中进程之间如何通信

  1.进程可以由进程PID在本地唯一标识,但在网络中不可行。

  2.TCP/ip协议族已经帮助我们解决了这个问题,即网络层的ip地址可以唯一标识网络中的主机;传输层的协议端口可以唯一地标识主机中的应用程序(进程)。

  3.使用ip地址、协议和端口,可以标识网络中的进程,网络中的进程通信可以使用这个标识与其他进程进行交互。

  什么是Socket?

  Socket,简称socket,是进程间的一种通信方式。socket与其他进程的区别在于,它可以实现不同主机之间的进程间通信。比如:QQ聊天,浏览网页,收发邮件等等。

  创建Socket

  Python中socket模块的函数socket:

  socket.socket(地址系列,类型)

  解释:

  socket.socket函数创建一个套接字并返回一个套接字。

  AddressFamily:网络中的进程间通信选择AF_INET,同一机器中的进程间通信选择AF_UNIX。实际中,AF_INET是常用的。

  类型:SOCK类型,可以是SOCK_STREAM,流套接字,主要用于tcp协议或者SOCK_DGRAM,数据报套接字,主要用于

  udp协议。

  

#import socket

  # udp:sock_dgram:数据报套接字

  # udpSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)

  #

  #

  # tcp:sock_stream:流式套接字

  # tcpSocket = socket(AF_INET, SOCK_STREAM)

  

  

UDP特点

  UDP:用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

  UDP:是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的

  UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

  UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。

  UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

  UDP一般用于多点通信和实时的数据业务。例如:语音广播、QQ、视频会议系统等。

  

  

UDP中客户端和服务器端交互

  UDP中客户端和服务器端交互

  

  服务器端具体实现代码如下:

  

#!/usr/bin/env python

  # -*- coding: utf-8 -*-

  # @Author : xiaoke

  import socket

  # 服务端

  def main():

   # 1,创建数据报套接字

   udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

   # 2,绑定本地地址,核心是为绑定并公布端口

   # 表示指定任意ip:0.0.0.0,系统中任意ip的数据都可以接收

   myAddr = (, 8080)

   udpSocket.bind(myAddr)

   # 3,接收客户端数据,获得客户端的地址(ip和端口号)

   recData, clientAddr = udpSocket.recvfrom(1024)

   print(clientAddr)

   print(recData.decode())

   # 4,回复客户端消息

   udpSocket.sendto(recData, clientAddr)

   # 5,关闭socket

   udpSocket.close()

  if __name__ == __main__:

   main()

  

  echo服务器端具体实现代码如下:

  

#!/usr/bin/env python

  # -*- coding: utf-8 -*-

  # @Author : xiaoke

  import socket

  # echo服务端,回射服务器,发过来,弹回去

  # 单进程单线程,无连接

  def main():

   # 1,创建数据报套接字

   udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

   # 2,服务端需要绑定:目的是把端口号和ip地址暴露给别人,让别人调用

   # 表示指定任意ip:0.0.0.0,系统中任意ip的数据都可以接收

   myAddr = (, 8080)

   udpSocket.bind(myAddr)

   while True:

   # 3,接收客户端数据,获得客户端的地址(ip和端口号)

   recData, clientAddr = udpSocket.recvfrom(1024)

   # print(clientAddr)

   print(recData.decode())

   # 4,回复客户端消息

   # udpSocket.sendto(recData, clientAddr)

   sendData = input("服务器!请输入提供的数据:")

   udpSocket.sendto(sendData.encode(), clientAddr)

   # 5,关闭socket

   udpSocket.close()

  if __name__ == __main__:

   main()

  

  客户端具体实现代码如下:

  

#!/usr/bin/env python

  # -*- coding: utf-8 -*-

  # @Author : xiaoke

  import socket

  # 客户端

  def main():

   # 1,创建udp类型的socket

   udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

   # 2,指定目的地址(ip和端口号

   serverAddr = (192.168.105.125, 8080)

   while True:

   # 3,发送数据

   sendData = input("客户端!请输入请求数据:")

   udpSocket.sendto(sendData.encode(), serverAddr)

   # 4,接收数据是一个元组,本次接收数据的最大长度,建议是2^xxx次方

   receData, peerAddr = udpSocket.recvfrom(1024)

   print(receData.decode())

   # print(peerAddr)

   # 5,关闭socket

   udpSocket.close()

  if __name__ == __main__:

   main()

  

  绑定端口的说明:

  1,一般情况下,在电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定。但是如果需要做成一个服务器端的程序的话,是需要绑定的。

  2,一个udp网络程序,可以不绑定端口,此时操作系统会随机进行分配一个端口,如果重新运行此程序,端口可能会发生变化。

  3,一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区分收到的网络数据是否是此进程的。

  

  

UDP网络通信过程

  

  

  

多线程聊天室服务器端的实现

  

#!/usr/bin/env python

  # -*- coding: utf-8 -*-

  # @Author : xiaoke

  import socket

  from threading import Thread

  def task_recv(s):

   while True:

   recvData, peerAddr = s.recvfrom(1024)

   print(子线程接收:ip地址 %s : 消息 %s % (str(peerAddr), recvData.decode()))

  def task_send(s, addr):

   while True:

   sendData = input(亲!请提供返回的数据:)

   s.sendto(sendData.encode(), addr)

  def main():

   # 1.创建udp数据报套接字

   serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

   # 2.绑定本地地址,核心是为绑定并公布端口

   myAddr = (, 8080) # 表示指定任意ip 0.0.0.0 系统中任意ip的数据都可以接收

   serverSocket.bind(myAddr)

   # 3.主线程收到消息,获得对方的ip,port

   recvData, peerAddr = serverSocket.recvfrom(1024)

   print(主线程接收:ip地址 %s : 消息 %s % (str(peerAddr), recvData.decode()))

   # 4.启动接收消息线程

   thread_recv = Thread(target=task_recv, args=(serverSocket,))

   thread_recv.start()

   # 5.再启动发送消息的线程,传递对方的ip port

   thread_send = Thread(target=task_send, args=(serverSocket, peerAddr))

   thread_send.start()

   # 6,等待子线程结束

   thread_recv.join()

   thread_send.join()

  if __name__ == "__main__":

   main()

  

  

  

UDP中广播

  

#!/usr/bin/env python

  # -*- coding: utf-8 -*-

  # @Author : xiaoke

  from socket import *

  def main():

   # 1,创建socket,数据报套接字

   udp_socket = socket(AF_INET, SOCK_DGRAM)

   # 2,设置允许广播

   # 设置socket属性,是否允许广播,1就是允许

   udp_socket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

   # 3,指定广播地址(“broadcast”,2425)

   broadcast_addr = (<broadcast>, 8080)

   # 4,发送消息,以下以飞秋软件演示

   send_data = b1:100:will:will-pc:32:will broadcast

   udp_socket.sendto(send_data, broadcast_addr)

   udp_socket.close()

  if __name__ == __main__:

   main()

  

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: