一   udp协议网络编程

 DNS:将域名解析成ip地址

  SOCK_DGRAM:数据报协议,也是udp协议

 udp协议的网络编程的一些用法:

  recvfrom:接收消息,接收的时一个元组,元组里面的元素分别为:一个消息,一个发送者的地址。

  sendto:发送消息,还要指定发送给谁。

实例:

服务端:

import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8088))
while True:
conn,addr=server.recvfrom(1024)
server.sendto(conn.upper(),addr)
server.close()

客户端:

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg=input('>>>:')
client.sendto(msg.encode('utf-8'),('127.0.0.1',8088))
print(client.recv(1024).decode('utf-8'))
client.close()

TCP套接字

1 low版TCP套接字

服务器端                              客户端

    

TCP套接字

1 low版TCP套接字

服务器端                              客户端

    

recv和recvfrom的区别?

  1、提前须知:

    1.1tcp是send发送消息,recv接收消息。

    1.2udp是sendto发送消息,recvfrom接收消息。

    1.3 在我眼里看来send只是发送一个数据对象,所以recv接收的也只是一个数据对象,而sendto发送的是个数据对象和ip端口两个信   息,所以接收的也应该是个数据对象和ip端口信息。

  2、tcp是基于数据流工作的,而udp是基于数据报工作的。

    2.1send(bytes_data)发送数据流时当数据流的数据为空那么发送到自己的socket缓存区时,操作系统会把空包发过去。

    2.2sendto(bytes_data,ip_port):发送数据报时,数据报中的数据为空但是ip和端口是不会为空的,发送到自己的缓存区后操作系统就会  对该数据进行处理

  3、recv和recvfrom

    3.1在tcp协议中如果服务器端接收缓冲区的数据为空,那么recv就会处于阻塞或者等待状态,这样客户端就一直没有返回的结果了。

    3.2tcp协议基于链接通信:

       基于链接通信就必须指定半连接池的大小——listen()

       基于链接必须先运行服务器端服务然后再运行客户端服务

       基于链接如果一端断开那么另一端也会跟着断开,所以要么在服务器端异常处理,要么设置if判断

    3.3在udp协议中如果服务器端接收缓冲区的数据为空,那么recvfrom也会阻塞,但是只不过dup协议的客户端sendto一个空数据并不是真的空数据,还有地址信息,所以服务器端也可以recvfrom到数据。

    3.4udp协议是无连接通信:

        所以不需要指定什么连接池的,也不需要服务器端运行了才能发送数据

粘包

  1、粘包须知:只有tcp协议才会出现粘包,udp协议是不会粘包的。

  2、什么是粘包?

    2.1如图所示:

      

    2.2无论是在服务端还是在客户端程序都是存在于用户态的,程序要想接受或者是发送数据都必须把数据交给操作系统,由操作系统来  控制底层硬件,从而达到发送数据和接受数据。而把数据是怎么交到操作系统手里的呢,首先程序会把数据发送到他的缓存空间里面,默认  大小是8K,然后操作系统来读取他的这个缓存空间中的数据从而进行转发。读分为两种情况,当缓存中的内存在规定的时间内占满了那么操  作系统就会读取缓存中的内容,还有一种情况就是当缓存中的数据超过规定的时间那么操作系统也会读取缓存中的数据进行转发。

    2.3无论是服务端还是客户端的发送或者是接收的大小都可以自己定义,因为对于tcp协议的应用程序来说他们看到的只是个整体或者说  是个流,一条消息有多少个自己他们是看不到的,所以说tcp协议是面向于流的协议,所以在接收一个数据时tcp不知道该数据到底要接收多  少个字节,然后就出现了粘包现象。

    2.4tcp协议是面向消息的协议,每一个udp段都是一段数据,或者说是一段消息,应用程序必须以这段消息为单位来提取这段数据,不  能一次性提取任意字节的数据,这一点和tcp协议很不相同,所以说udp协议是不会出现粘包现象的。

    2.5因此在tcp协议中所谓的粘包现象无非就是好接收者不知道到底该接收多少个字节的数据而已。

  3、小结:

    3.1:udp协议的recvfrom()是阻塞的,一个recvfrom(x)必须对一个sendto(y)收完了才算完成传输,如果x>y就会出现丢包现象。

    3.2:tcp协议数据不会丢失没有收完包,下次连接会基于上次连接再进行传输。传输端接收到ack时才会清空缓冲区的内容。

  4、两种清空下产生粘包现象

    4.1::当发送者的缓存区在规定的时间内满了后发送数据会产生粘包现象。

    4.2:客户端在规定的时间内在缓冲区没有完全的接收到发送者发来的包,只接受到了一部分包,那么下一次接收时就会产生粘包现  象。

  5、应当注意的一些问题。

    5.1当发送到发送的数据包大于网卡规定MTU的大小时,这时网卡会把该数据包分成几个小数据包发送出去,只要接收端依次接收就可  以了。  

    5.2send的字节流先发送到自己的缓存区(该缓存区可能还缓存的有其他数据),那么当需要缓存的数据大小大于剩余缓存区的空间这样就会数据丢失,所以用sendall就会循环发送需要缓存的数据,解决了数据丢失问题。

二 并发编程基础讲解

 1 进程的概念起源于操作系统。

  2 进程是一个正在进行执行的程序

  3 为什么要有操作系统:主要为了管理计算机的硬件。

  4 操作系统的功能:1 协调管理硬件和软件之间的关系;2 将应用程序对硬件的资源有序化。

 5 什么是接口:对外提供的一个链接,或者别人提供给我的一个链接,来调用别人的一个功能。

  6 内核:操作硬件

 7 多道技术:就是为了时间和空间上的复用。

操作系统详情和计算机的发展史详情:http://www.cnblogs.com/linhaifeng/p/6295875.html

网络编程之基于tcp和udp的套接字的更多相关文章

  1. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

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

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

  3. day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题

    TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...

  4. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  5. python网络编程(Socket、TCP、UDP)

    Socket 是网络编程的一个抽象概念,通常我们用一个Socket表示 "打开了一个网络链接",而打开一个Socket 需要知道目标计算机的IP 地址和端口号,再指定协议类型即可. ...

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

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

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

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

  8. Linux网络编程:基于TCP的程序开发回顾篇《转》

    面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...

  9. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

随机推荐

  1. js前端导出excel:json形式的导出

    第一中形式的导出:主要是表头对应主体数据,json形式的导出 js库文件名称 : table2excel.js这个js库文件是网上找的,并且自己根据自己业务需求把内容改了一下复制到 table2exc ...

  2. f5冗余BIG-IP系统的安装

    1.设备服务群集 •一个系列的BIG-Ips彼此互相支持DSC •每一台BIG-IP 自己生成一个Device Object •不同设备的信息 •建立信任证书 •在local device上设置Dev ...

  3. 常用的key和oid

    1.FortiGate Template-Network-Office-Fortigate-Session Count:key,fgSysSesCount   oid,.1.3.6.1.4.1.123 ...

  4. 项目总结06:Java Excel文件导入功能HSSFWorkbook(xls)和 XSSFWorkbook (xlsx)

    项目中碰到Excel文件打入数据功能Mark一下 package com.blue.pem.client.util; import java.io.File; import java.io.FileI ...

  5. CQ3

    super.bark(); 不要第一个括号   Write a concrete meow( ) method 抽象类实例化后要加一个实例化的方法. 抽象类里可以没有抽象方法.   What does ...

  6. 各个JSON技术的比较(Jackson,Gson,Fastjson)的对比

    JSON技术的调研报告 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括 ...

  7. mysql中left join设置条件在on与where时的区别

    一.首先我们准备两张表来进行测试. CREATE TABLE `a` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `na ...

  8. stark组件开发之列表页面预留钩子方法。 可根据用户的不同,显示不同的列

    要实现,这个方法.子类中 list_diplay 这个列表, 就不能够写死.他应该是 可以根据.用户的不同,返回不同的值. 所以 就需要一个函数, 可以进行判断当前用户是谁. 并且往这个列表中添加,他 ...

  9. MVC的Forms登录验证

    第一步:修改web.config配置 在 <system.web>节点下加入配置:未登录的用户跳转到/Home/Login,登录后跳转到/Home/UserCenter,登录后票证记录到c ...

  10. python 基本数据类型 之 字符串

    字符串数据出现的意义 掌握字符串的定义和特性 能熟练掌握字符串常用操作,并了解其他工厂方法 字符串的定义和创建 字符串是一个有序的字符集合,用于存储和表示基本的文本信息,  用引号“          ...