UDP-用户数据报协议1.介绍2.udp网络程序-发送数据udp网络程序-发送、接收数据echo服务器广播用代码给飞秋发信息收消息

UDP-用户数据报协议1.介绍2.udp网络程序-发送数据udp网络程序-发送、接收数据echo服务器广播用代码给飞秋发信息收消息

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

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

特点:UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

语音广播视频QQTFTP(简单文件传送)SNMP(简单网络管理协议)RIP(路由信息协议,如报告股票市场,航空信息)DNS(域名解释)查看端口

用“netstat -an”查看端口状态2.udp网络程序-发送数据socket函数

mySocket = socket(family, type)

函数socket()的参数family用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。

通信协议族

函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。

并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。

udp网络程序-发送、接收数据代码语言:javascript复制from socket import *

#1. 创建套接字

udpSocket = socket(AF_INET, SOCK_DGRAM)

#2. 准备接收方的地址

sendAddr = ('192.168.1.103', 8080)

#3. 从键盘获取数据

sendData = input("请输入要发送的数据:")

#4. 发送数据到指定的电脑上

udpSocket.sendto(sendData, sendAddr)

#5. 等待接收对方发送的数据

recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数

#6. 显示对方发送的数据

print(recvData)

#7. 关闭套接字

udpSocket.close()echo服务器代码语言:javascript复制from socket import *

# 1. 创建套接字

udpSocket = socket(AF_INET, SOCK_DGRAM)

# 2. 绑定本地的相关信息

bindAddr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip

udpSocket.bind(bindAddr)

num = 1

while True:

# 3. 等待接收对方发送的数据

recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数

# 4. 将接收到的数据再发送给对方

#udpSocket.sendto(recvData[0], recvData[1])

udpSocket.sendto(str(len(recvData[0].decode('gbk'))).encode('gbk'), recvData[1])

# 5. 统计信息

print('已经将接收到的第%d个数据返回给对方,内容为:%s' % (num, recvData[0].decode('gbk')))

num += 1

# 5. 关闭套接字

udpSocket.close()广播代码语言:javascript复制import socket

'''

1、一对一 点对点 单播

2、一对多 多播

3、一对所有 广播

'''

#创建socket对象

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

#开启广播

udpSocket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

#目的地:如果是''表示当前IP,如果是''表示当前所在的广播地址

destAdress = ('',2425)

#消息内容

sendMsg = input('>>')

#编码

sendMsg = sendMsg.encode('gbk')

#发送

udpSocket.sendto(sendMsg,destAdress)

while True:

(content,address) = udpSocket.recvfrom(1024)

print("received from %s----%s" % (address, content.decode('gbk')))

#关闭socket对象

udpSocket.close()

print('over......')要查看当前广播位置有3种方法

广播的计算方法在线网络计算器直接用 表示当前所在的广播地址用代码给飞秋发信息代码语言:javascript复制'''

应用程序可以在通用的tcp/ip协议基础上,加上自己的判断,组成新的应用层协议。

比如飞秋,使用的是udp协议,在此基础上包装成了IPMSG协议。

格式:

版本号:包编号:发送者姓名:发送者机器名:命令字:消息

1:12323434:user:machine:32:hello

1::13212321:易烊千玺:【易烊千玺】:32:努力来见我

注:现行的IPMSG协议的版本是1

'''

import socket

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

destAdress = ('192.168.11.66',2425)

sendMsg = input('>.')

sendMsg = sendMsg.encode('gbk')

udpSocket.sendto(sendMsg,destAdress)

udpSocket.close()

print('over..')运行结果:

代码语言:javascript复制>.1::13212321:易烊千玺:【易烊千玺】:32:努力来见我

over..收消息_没绑定端口号代码语言:javascript复制import socket

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

destAdress=('192.168.11.66',8888)

sendMsg = input('--')

sendMsg = sendMsg.encode('gb2312')

udpSocket.sendto(sendMsg,destAdress)

recvMsg=udpSocket.recvfrom(1024)

recvMsg='【Receive from %s : %s 】: %s'%(recvMsg[1][0],recvMsg[1][1],recvMsg[0].decode('gbk'))

print(recvMsg)

udpSocket.close()

print('over.......')收消息_绑定端口代码语言:javascript复制import socket

#创建socket对象

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

'''

绑定,

第一个参数是本地ip,不指定也可以,默认会帮你填充,建议不写

第二个参数是端口号,不要与本地的端口号冲突

'''

localAdress = ('',8081)

udpSocket.bind(localAdress)

#目的地

destAdress = ('192.168.11.66',8888)

#消息内容

#sendMsg = input('>>')

#编码

#sendMsg = sendMsg.encode('gb2312')

#发送

#udpSocket.sendto(sendMsg,destAdress)

'''

收,这个缓冲区不是越大越好,如果发送方的数据,大于缓冲区,丢包,报错。

如果收不到,阻塞

'''

recvMsg = udpSocket.recvfrom(1024)

recvMsg = '【Receive from %s : %s】:%s'%(recvMsg[1][0],recvMsg[1][1],recvMsg[0].decode('gbk'))

print(recvMsg)

#关闭socket对象

udpSocket.close()

print('over......')多线程聊天代码语言:javascript复制'''

收和发互相不影响:

这是两个独立的功能,可以考虑两个线程

'''

from socket import *

from threading import *

import os

'''全局变量'''

# socket

udpSocket = None

# ip

destIp = None

# port

destPort = None

# 收

def recv():

while True:

recvInfo = udpSocket.recvfrom(1024)

print("\r<<%s:%s%s>>" % (str(recvInfo[1]), recvInfo[0].decode('gbk'),os.linesep),end='')

# 发

def send():

while True:

info = input('>>')

udpSocket.sendto(info.encode('gbk'), (destIp, destPort))

# 主方法

def main():

global udpSocket

global destIp

global destPort

udpSocket = socket(AF_INET, SOCK_DGRAM)

bindAddr = ('', 8888) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip

udpSocket.bind(bindAddr)

#destIp = input("对方的ip:")

#destPort = int(input("对方的port:"))

destIp = '192.168.11.66'

destPort = 8080

tSend = Thread(target=send)

tRecv = Thread(target=recv)

tSend.start()

tRecv.start()

if __name__ == '__main__':

main()结果:

代码语言:javascript复制>>北方有佳人

<<('192.168.11.66', 8080):遗世而独立

>>一顾倾人城

<<('192.168.11.66', 8080):再顾倾人国

>>注释

os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。\r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容

相关推荐

如何删除抖音的收藏
365bet网站地址

如何删除抖音的收藏

📅 08-11 ❤️ 991
热血战歌
365bet游戏官方开户

热血战歌

📅 07-09 ❤️ 109
直邮和转运哪个容易被税?哪个更省心?
365bet提前结束投注

直邮和转运哪个容易被税?哪个更省心?

📅 06-26 ❤️ 142