服务端:
ss=socket() #创建服务器套接字
ss.bind() #把地址绑定到套接字
ss.listen() #监听套接字,
inf_loop: #服务器无限循环
cs=ss.accept() 接受客户端连接
comm_loop: #通讯循环
cs.recv()/cs.send() #对话(接收与发送)
cs.close() #关闭客户端套接字
ss.close() #关闭服务器套接字(可选) #客户端
14 cs=socker()  #创建客户端套接字
15 cs.connet()   #尝试连接服务器
16 command_loop:  #通讯循环
17   cs.send()/cs.recv()  #对话(发送/接收)
18 cs.close()   #关闭客户端套接字

这是基于TCP连接的套接字模型。

UDP链接的套接字模型是这样的:

服务端:
ss=socket() #创建一个服务器的套接字
ss.bind() #绑定服务器套接字
inf_loop: #服务器无限循环
cs=ss.recvfrom()/ss.sendto() #对话(接收与发送)
ss.cloes() #关闭服务器套接字 客户端:
cs=socket() #创建客户端套接字
comm_loop: #通信循环
cs.sendto()/cs.recvfrom() #对话(发送和接收)
cs.close() #关闭客户套接字

UDP的会话的无关先启动哪一端,先启动服务端或者客户端都不会报错。

而且当客户端发消息的时候,无论服务端收到或者收不到都不会报错;

客户端和服务端收到的消息都分为两部分,

(b"发送的内容",("127.0.0.1",4888)) 我们可以利用 data1,client_addr=udp_server.recvfrom(1024)这种方式来收取数据和对方的地址。

 #udp服务端
from socket import * udp_server=socket(AF_INET,SOCK_DGRAM)
udp_server.bind(('127.0.0.1',8080)) while True:
data,client_addr=udp_server.recvfrom(1024)
print(data,client_addr)
udp_server.sendto(data.upper(),client_addr) #udp client
from socket import * udp_client=socket(AF_INET,SOCK_DGRAM) while True:
msg=input('>>: ').strip()
udp_client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,server_addr=udp_client.recvfrom(1024)
print(data.decode('utf-8'))

基于TCP的连接,发送数据的时候可能会发生粘包(在数据量比较小,时间间隔比较短的情况下),所以我们要探讨下UDP会不会出现这种情况。

#测试代码:

 #udp    server
from socket import *
udp_server=socket(AF_INET,SOCK_DGRAM)
udp_server.bind(('127.0.0.1',8080)) data1,client_addr=udp_server.recvfrom(1)
print('data1',data1)
data2,client_addr=udp_server.recvfrom(1024)
print('data2',data2) #udp client
from socket import *
udp_client=socket(AF_INET,SOCK_DGRAM) udp_client.sendto('hello'.encode('utf-8'),('127.0.0.1',8080))
udp_client.sendto('world'.encode('utf-8'),('127.0.0.1',8080))

#通过代码测试我们可以清楚的看到,基于UDP的链接不会发生粘包现象

#但是当UDP发送的字节大于服务端(或者客户端)所接收的字节时,会报错。


实现并发的UDP链接:

#服务端
import socketserver
class MyUDPhandler(socketserver.BaseRequestHandler):
def handle(self):
print(self.request)
      #(b'aaa', <socket.socket fd=252, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)打印出来是这种格式
 #数据+用来给回消息的socket+地址
      self.request[1].sendto(self.request[0].upper(),self.client_address) if __name__ == '__main__':
s=socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUDPhandler) #UDP的socket服务进程,()内的是地址和端口,后边跟的是自己定义的类
s.serve_forever()

Day9 基于TCP的套接字和基于UDP的套接字的更多相关文章

  1. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  2. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  3. 基于TCP的socket套接字的网络编程(客户端/服务端模式)

    于数据完整性要求较高的场合,就应采用TCP协议. IP网络层提供IP寻址和路由.因为在网络上数据可以经由多条线路到达目的地,网络层负责找出最佳的传输线路. IP地址与数据包: IP层就是把数据分组从一 ...

  4. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  5. python基础22------python基础之基于tcp和udp的套接字

    一.TCP套接字 1.low版tcp套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就 ...

  6. 20181225 基于TCP/IP和基于UDP/IP的套接字编程

    一.TCP/IP的套接字编程 服务器端代码: import  socket​server = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.sock ...

  7. unix网络编程第四章----基于TCP套接字编程

    为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...

  8. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  9. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

随机推荐

  1. Latex 表格内文字过长自动换行

    法一: [plain] view plaincopy \begin{tabular}{m{5cm}} 法二: [plain] view plaincopy \begin{tabular}{p{0.9\ ...

  2. 学生信息管理小系统(以XML为存储方式)

    为了更好地应用XML,就写了这个小项目. 下面是我的项目的目录结构 项目思路 dao是Date Access Object 数据访问层,主要是负责操作数据 domain是实体层,类似于bean层,放置 ...

  3. 设计比较好,有助于学习的Github上的iOS App源码 (中文)

    Github版 中文 : TeamTalk 蘑菇街. 开源IM. 电商强烈推荐. MyOne-iOS 用OC写的<一个> iOS 客户端 zhihuDaily 高仿知乎日报 Coding ...

  4. Uva - 1607 - Gates

    题目理解麻烦,估计提交量少(总共只有32个人...)也是因为题目比较麻烦,看起来像物理题,实际理解了还可以.整个电路的功能就4种,先判断x=0和x=1的输出是否相同,吐过相同,而整个电路是常熟,随便输 ...

  5. 基于Bootstrap的Metro风格模板

    这几天在看Bootstrap的一些书,这里整理一下书中的一些模板,方便以后使用. 1.BootMetro http://www.guoxiaoming.com/bootmetro/ 2.Bootswa ...

  6. python的map

    map(function, iterable, ...) 将function放到迭代的每个元素执行,结果为list. 引自>:http://my.oschina.net/zyzzy/blog/1 ...

  7. java工具类(二)之java正则表达式表单验证

    java正则表达式表单验证类工具类(验证邮箱.手机号码.qq号码等) 这篇文章主要介绍了java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等方法,需要的朋友可以参考下. jav ...

  8. OpenCV进行图像相似度对比的几种办法

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/43853435, 来自:shiter编写程序的艺术 对计算图像相似度的方法,本文做 ...

  9. Android ORM 框架之 greenDAO

    前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM  ...

  10. MySQL内存调优

    原文链接: MySQL Memory Allocation -- by Rick James原文日期: Created 2010; Refreshed Oct, 2012, Jan, 2014 翻译人 ...