Python—Socket套接字!

作者: 14e61d025165 | 来源:发表于2019-04-01 15:26 被阅读0次

基于UDP的socket

面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃,并不能到达服务器端

由于UDP是面向无连接的(实际上有链接,不然通过什么去传数据去取数据),可以使用多个客户端连接服务端,但这并不是并发访问。

注意:

  1. 发消息,都是将数据发送到己端的发送缓冲中,收消息都是从己端的缓冲区中收

tcp:send发消息,recv收消息

udp:sendto发消息,recvfrom收消息

  1. tcp是基于数据流的,而udp是基于数据报的:

send(bytes_data):发送数据流,数据流bytes_data若为空,自己这段的缓冲区也为空,操作系统不会控制tcp协议发空包

sendinto(bytes_data,ip_port):发送数据报,bytes_data为空,还有ip_port,所有即便是发送空的bytes_data,数据报其实也不是空的,自己这端的缓冲区收到内容,操作系统就会控制udp协议发包。

3.1 tcp协议

(1)如果收消息缓冲区里的数据为空,那么recv就会阻塞(阻塞很简单,就是一直在等着收)

(2)只不过tcp协议的客户端send一个空数据就是真的空数据,客户端即使有无穷个send空,也跟没有一个样。

(3)tcp基于链接通信

基于链接,则需要listen(backlog),指定半连接池的大小

基于链接,必须先运行的服务端,然后客户端发起链接请求

对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)

对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)

3.2 udp协议

(1)如果如果收消息缓冲区里的数据为“空”,recvfrom也会阻塞

(2)只不过udp协议的客户端sendinto一个空数据并不是真的空数据(包含:空数据+地址信息,得到的报仍然不会为空),所以客户端只要有一个sendinto(不管是否发送空数据,都不是真的空数据),服务端就可以recvfrom到数据。

(3)udp无链接

无链接,因而无需listen(backlog),更加没有什么连接池之说了

无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失

recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错

只有sendinto发送数据没有recvfrom收数据,数据丢失

实现代码

服务端:

导入socket模块

import socket

创建socket

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

绑定地址和端口

skt.bind(('127.0.0.1',9090))

循环

while True:
#调用接受消息
data,addr = skt.recvfrom(1024)
#接受成功回复消息
rst = b'I am fine'
skt.sendto(rst,addr)
print('server Done')
#关闭链接
skt.close()

客户端

导入模块

import socket

创建socket

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

创建发送消息和发送目标

msg = b'Hello world'
addr = ('127.0.0.1',9090)
skt.sendto(msg,addr)

接受回复

rst = skt.recvfrom(1024)
print(rst)
print('client done')

关闭链接

skt.close()

相关文章

  • day19

    socket套接字 socket又叫套接字,实现网络通信的python通过提供socket标准库来支持socket...

  • day18网络基础

      socket又叫做套接字,就是进行数据通信两端,分为服务端套接字和客户端套接字。  python对socket...

  • 2018-09-12 day -18网络基础(含作业)

    1.socket编程 socket又叫套接字,就是进行数据通信两端。分为服务端套接字和客户端套接字。 python...

  • 用socket和多进程配合多线程实现简单的tcp的聊天服务器

    python中的socket套接字用于实现网络通信tcp套接字的使用流程如下: 创建套接字对象 --- cli...

  • 第19天总结网络通信

    socket又叫套接字,实现网络通信的两端就是套接字。分为服务器对应的套接字和客户端对应的套接字 python通过...

  • python网络编程

    socket又叫套接字,实现网络通信的两端就是套接字。分为服务器对应的套接字和客户端对应的套接字。python通过...

  • 一阶段day19-03socket服务器

    socket又叫套接字,实现网络通信的两端就是套接字。分为服务器对应的套接字和客户端对应的套接字。Python通过...

  • iOS 原生Socket和CocoaAsyncSocket框架的

    一、Socket到底是什么? 1、Socket原理 1.1、套接字(Socket)概念 套接字(Socket)是通...

  • 01-网络编程

    socket 在python中,使用socket模块的函数socket就可以完成. 发送消息 接收消息 套接字在同...

  • Python—Socket套接字!

    基于UDP的socket 面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃...

网友评论

    本文标题:Python—Socket套接字!

    本文链接:https://www.haomeiwen.com/subject/wwuvbqtx.html