linux中UDP程序流程、客户端、服务端

来源:互联网 发布:淘宝上nike官方旗舰店 编辑:程序博客网 时间:2024/05/17 22:04

UDP--- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议。

 

优点:传输速度快

缺点:不可靠

 

socket的中文意思是接插件:

 

创建socket

在 Python 中 使用socket 模块的类 socket 就可以完成:

 

socket.socket(AddressFamily,Type)

说明:

函数 socket.socket 创建一个 socket,返回该 socket的描述符,该函数带有两个参数:

  • Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
  • Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

 

udp服务端:

import socket

# 1.创建套接字
server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#2. bind绑定ip地址和端口,为元祖tuple类型
#ip如果不指明,表示本机的任何一个ip地址
server_addr = (
"",8080)
server_sock.bind(server_addr)

whileTrue:
   
# recv方法接收发送过来的数据
   
#返回值为接收到的数据,参数(这里为1024)表示本次收取数据的最大字节数
   
# receive_data = server_sock.recv(1024)
   
# recvfromrecv方法类似,不同的是可以将发送数据的客户端的地址也返回
    receive_data, client_addr =server_sock.recvfrom(
1024)
   
#注意python3中收到的数据receive_databytes类型
   
# print(client_addr, ": ",receive_data)
   
#bytes数据转换为字符串类型
    msg = receive_data.decode(
"utf-8")
   
#将收到的数据显示输出
    print(client_addr,
": ", msg)
   
#我们假定如果客户端发送了quit,我们就关闭服务端的套接字(即关闭服务端)
   
if msg =="quit":
        server_sock.close()
       
break

测试:

# -u表示使用udp协议
# nc -u 服务器ip 服务器端口
nc -u
127.0.0.18080

 

udp客户端

import socket

# 1.创建套接字
client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#服务器地址
server_addr = (
'127.0.0.1',8080)

data = input("请输入要发送的内容:")
#只要用户输入的数据不为空,就向服务器端发送
while data:
   
# 2.使用sendto方法向服务器发送数据
   
# sendto(bytes类型要发送的数据,对方的地址)
    client_sock.sendto(data.encode(
"utf-8"),server_addr)
    data = input(
"请输入要发送的内容:")

#当用户输入的数据为空(""),关闭客户端套接字
client_sock.close()

测试

服务端与客户端的程序我们都已完成,可以同时开启进行测试。

我们也可以用nc充当udf服务端来单独测试客户端程序。

# -l表示作为服务端开启,进行监听listen
# -u表示使用udp协议
# nc-lu 绑定的服务器ip地址 端口
nc -lu
127.0.0.18080

 

网络编程中的广播

import socket

#创建udp套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 告诉系统内核刚创建的套接字用来进行广播
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,
1)
data = input(
"请输入要广播的内容:")
while data:
   
# 注意对于广播对象地址的设置
   
# <broadcast>表示广播地址
    s.sendto(data.encode(
"utf-8"), ("<broadcast>",8080))
    data = input(
"请输入要广播的内容:")

s.close()

 

udp总结

1.udp是传输层的一种协议,不需要进行连接就可以用来发送和接收数据,但不保证数据的可靠传输。

2. udp服务器、客户端

1udp的服务器和客户端的区分:往往是通过请求服务提供服务来进行区分

2请求服务的一方称为:客户端

3提供服务的一方称为:服务器

3. udp绑定问题

1、一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程

2、客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况

原创粉丝点击