udp网络程序-发送、接收数据
from socket import *
socket_udp = socket(type=SOCK_DGRAM)
#不写ip,自动设置本地ip
address1 = ('',12345)
socket_udp.bind(address1)
print('接收中...')
data,address = socket_udp.recvfrom(1024)
data = data.decode('gbk')
ip = address[0]
port = address[1]
print('【Receive from %s : %s】:%s'%(ip,port,data))
#socket_udp.send(b'ok',address)
socket_udp.close()
print('哦了。。。。。。')
udp绑定信息
fromsocketimport*
#1.创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2.绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
bindAddr = ('',7788)# ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udpSocket.bind(bindAddr)
#3.等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024)# 1024表示本次接收的最大字节数
#4.显示接收到的数据
print(recvData)
#5.关闭套接字
udpSocket.close()
·一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行次程序端口可能会发生变化
·一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的
模型比较
1.共同点
(1)OSI参考模型和TCP/IP参考模型都采用了层次结构的概念。
(2)都能够提供面向连接和无连接两种通信服务机制。
2.不同点
(1)OSI采用的七层模型,而TCP/IP是四层结构。
(2)TCP/IP参考模型的网络接口层实际上并没有真正的定义,只是一些概念性的描述。而OSI参考模型不仅分了两层,而且每一层的功能都很详尽,甚至在数据链路层又分出一个介质访问子层,专门解决局域网的共享介质问题。
(3)OSI模型是在协议开发前设计的,具有通用性。TCP/IP是先有协议集然后建立模型,不适用于非TCP/IP网络。
(4)OSI参考模型与TCP/IP参考模型的传输层功能基本相似,都是负责为用户提供真正的端对端的通信服务,也对高层屏蔽了底层网络的实现细节。所不同的是TCP/IP参考模型的传输层是建立在网络互联层基础之上的,而网络互联层只提供无连接的网络服务,所以面向连接的功能完全在TCP协议中实现,当然TCP/IP的传输层还提供无连接的服务,如UDP;相反OSI参考模型的传输层是建立在网络层基础之上的,网络层既提供面向连接的服务,又提供无连接的服务,但传输层只提供面向连接的服务。
(5)OSI参考模型的抽象能力高,适合与描述各种网络;而TCP/IP是先有了协议,才制定TCP/IP模型的。
(6)OSI参考模型的概念划分清晰,但过于复杂;而TCP/IP参考模型在服务、接口和协议的 区别上不清楚,功能描述和实现细节混在一起。
(7)TCP/IP参考模型的网络接口层并不是真正的一层;OSI参考模型的缺点是层次过多,划分意义不大但增加了复杂性。
(8)OSI参考模型虽然被看好,由于没把握好时机,技术不成熟,实现困难;相反,TCP/IP参考模型虽然有许多不尽人意的地方,但还是比较成功的。
udp应用:聊天室
from socket import *
from threading import *
import time
def func(data,address):
data = data.decode('gbk')
ip = address[0]
port = address[1]
print('【Receive from %s : %s】:%s' % (ip, port, data))
content = input('>').encode('gbk')
socket_server.sendto(content, address)
if __name__ == '__main__':
socket_server = socket(type=SOCK_DGRAM)
address1 = ('',12345)
socket_server.bind(address1)
print('开始接收...')
while True:
data,address = socket_server.recvfrom(1024)
# for i in range(10):
# print(i)
# time.sleep(1)
Thread(target=func,args=(data,address)).start()
socket_server.close()
print('哦了。。。。。。')
udp应用:给飞秋发消息
应用程序可以在通用的tcp/ip协议基础上,加上自己的判断,组成新的应用层协议。
比如飞秋,使用的是udp协议,在此基础上包装成了IPMSG协议。
格式:
版本号:包编号:发送者姓名:发送者机器名:命令字:消息
1:12323434:user:machine:32:hello
注:现行的IPMSG协议的版本是1
'''
import socket
#创建socket对象
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#目的地
destAdress = ('192.168.11.74',2425)
#消息内容
sendMsg = input('>>')
#编码
sendMsg = sendMsg.encode('gbk')
#发送
udpSocket.sendto(sendMsg,destAdress)
#关闭socket对象
udpSocket.close()
print('over......')
udp广播:群发
'''设置socket选项使用端口号的时候,如果端口号,不报错,阻塞。一旦端口号可以用了,正常运行了。socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)设置广播socket_udp.setsockopt(SOL_SOCKET,SO_BROADCAST,1)'''from socket import *socket_udp = socket(type=SOCK_DGRAM)#设置广播socket_udp.setsockopt(SOL_SOCKET,SO_BROADCAST,1)#自动计算广播地址#address=('',2425)
address=('192.168.12.127',2425)
content = input('>')
socket_udp.sendto(content.encode('gbk'),address)
socket_udp.close()
print('哦了。。。。。。')
print(address)
udp总结
udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信
2. udp服务器、客户端
·udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分
·请求服务的一方称为:客户端
·提供服务的一方称为:服务器
3. udp绑定问题
·一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
·客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况
tcp服务器
如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:
1.socket创建一个套接字
2.bind绑定ip和port
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接
5.recv/send接收发送数据
tcp收
from socket import *
import time
#创建socket对象
tcp_server = socket()
#绑定
tcp_server.bind(('',56789))
#监听
tcp_server.listen()
#等待接收
print('等待接收。。。')
'''
返回一个元组,两个值
第一个值,也是一个tcp对象,这个对象可以给对应的客户端收发消息
第二个值,客户端的地址
'''
tcp_client,address = tcp_server.accept()
#print(tcp_client)
#print(address)
#tcp_client.send(b'OK')
content = tcp_client.recv(1024)
print('【Receive from %s : %s】:%s'%(address[0],address[1],content.decode('utf-8')))
#time.sleep(6)
#关闭
tcp_client.close()
#关闭
tcp_server.close()
print('哦了......')
tcp发
from socket import *
import time
#创建socket对象
tcp_client = socket()
try:
#连接
tcp_client.connect(('192.168.12.11',56789))
except:
print('连接失败')
else:
#发送消息
tcp_client.send('你好,老王'.encode('utf-8'))
tcp_client.close()
print('哦了......')