一、C/S架构

1.硬件C/S架构
  如PC-打印机
2.软件C/S架构
  如PC-网站服务器
参照:
  https://baike.baidu.com/item/Client%2FServer/1504488?fr=aladdin&fromid=826311&fromtitle=C%2FS

二、OSI七层模型

 
  OSI七层中,对应着网络通信中的各个通信协议,了解OSI七层的运作过程是socket编程的重重之重,为什么这么说?看下图:
       
  从图中看出,socket工作于软件C/S架构以及OSI七层模型中的应用层和传输层之间
附:         
TCP协议详解:

三、socke是什么狗屁?

  socket原指孔或插座,最初是作为BSD UINX的进程通信机制,同被称为套接字。当今套接字是Windows和Mac等操作系统所共同遵守的网络编程标准,是OSI七层模型中应用层和传输层之间抽象层,用于描述IP地址和端口,是一个通信链的句柄,可用来实现不同虚拟机或不同计算机之间的通信或者主机内的不同进程间的通信。Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。
  在操作系统上,  socket屏蔽了TCP/IP网络传输层及以下的网络细节,为操作系统提供网络抽象,开发者编写的网络程序都会直接或间接地用到socket抽象。通过socket抽象可以直接控制传输层的两大协议(TCP、UDP),甚至包括IP、ICMP等网络层协议。
       简单的说,socket就是一条IP地址+端口+协议的三元组唯一标识一条通信链路,服务器端的一个通信链路可以对应多个客户端。

四、socket的种类

1.基于文件系统的套接字家族
  套接字家族的名字:AF_UNIX
  之前提到,socket最初是作为UNIX的进程机制,UNIX一切皆文件,它是基于文件的套接字调用的就是底层的文件系统取数据,两个套接字进程运行在同一机器上,可通过访问同一文件系统间接完成通信。
 2.基于网络类型的套接字家族:
  网络类型套接字名字:AF_INET
  基于IPv4的套接字,另外还有用于IPv6的AF_INET6

五、socket编程

1.套接字工作流程
 
 
2.基于TCP的套接字简单实现
# 服务器端
import socket # 实例化一个socket对象,并指定网络层协议、传输层协议
socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP、端口号
socket_server.bind(('127.0.0.1',8080),)
# 同一时间内能够接收的请求
socket_server.listen(5)
# 等待连接
connect,client_address = socket_server.accept()
# 设置接收消息,最大限制为1024
receive_mag = connect.recv(1024)
print('收到客户端的消息:%s' % receive_mag.decode('UTF-8'))
# 发送数据
connect.send(receive_mag.upper()) # 关闭连接
connect.close() # 客户端
import socket socket_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接服务端,指定IP、端口号
socket_client.connect(('127.0.0.1',8080))
# 向服务端发消息
socket_client.send('Hello,I am client!'.encode('utf-8'))
data = socket_client.recv(1024)
print('接收到服务器的消息:%s' % data.decode('utf-8')) socket_client.close()

3.基于TCP的套接字连接循环和通信循环

# 服务器端
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8080))
phone.listen(5)
while True: # 连接循环
connect,client_address = phone.accept()
print('客户端:',client_address)
while True: # 通信循环
try:
msg = connect.recv(1024)
print('客户端消息:',msg)
connect.send(msg+b'from server')
except ConnectionResetError:
break
connect.close()
phone.close() # 客户端
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080)) # 拨电话,地址为服务端的ip和端口
while True:
msg = input('>>>).strip()
phone.send(msg.encode('utf-8')) # 发消息
data = phone.recv(1024) #收消息
print(data.decode('utf-8'))
phone.close()

4.基于UDP的套接字实现

  1)UDP原理

    参考:https://baike.baidu.com/item/UDP/571511

  2)套接字实现

# 服务器端
import socket # SOCK_DGRAM 数据包协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080),) while True:
data,addr = server.recvfrom(1024)
print(data.decode('utf-8'),addr)
server.sendto(data.upper(),addr)

# 客户端
import socket # SOCK_DGRAM 数据包协议
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True:
msg = input('>>>').strip()
if len(msg) == 0:continue
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,addr = client.recvfrom(1024)
print(data.decode('utf-8'),addr)

Python全栈-网络编程基础的更多相关文章

  1. Python全栈-网络编程-TCP粘包

    一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...

  2. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  3. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  4. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  5. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

  6. python学习之网络编程基础

    引入场景:客户与银行关系 银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系.此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关 ...

  7. Python全栈开发-Day1-Python基础1

    目录 Python介绍 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式f ...

  8. Python全栈-day4-语法基础2

    一.字符串 1.字符串基础 1)作用:用于描述姓名.性别.地址等信息 2)定义方式:单引号或者双引号以及三引号内添加字符 注:day3中介绍 name = 'zhang' user_name = &q ...

  9. Python全栈开发-Day3-Python基础3

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3.递归 4.函数式编程介绍 5.高阶函数 1.函数基本语法及特性 三种编程范式: 1.面向过程:过程——> def 2.面向对象:类— ...

随机推荐

  1. LeetCode 897 Increasing Order Search Tree 解题报告

    题目要求 Given a tree, rearrange the tree in in-order so that the leftmost node in the tree is now the r ...

  2. 2018/05/11 PHP 设计模式之 适配器模式

    什么是适配器模式? 简单来说,我想买一根充电线,我买一根安卓的?还是买一根苹果的? 我也不确定,因为我以可能会换手机,对于我的形式我也不确定. 所以,我要买一根可以同时适配 安卓/苹果 的线. 所谓适 ...

  3. elastic search范围查询

    queryBuilder.must(QueryBuilders.rangeQuery("pt_longitude").from(minLongitude).to(maxLongit ...

  4. wait()函数的详细分析

    之前一直没太深入的去理解wait()函数,今天机缘巧合之前又看了看,发现之前没有真正的理解该函数. 众所周知,wait()函数一般用在父进程中等待回收子进程的资源,而防止僵尸进程的产生. (In UN ...

  5. 浏览器数据库 IndexedDB 入门教程

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  6. SSH的三种端口转发

    1.本地转发 本地转发,顾名思义就是把本地主机端口转发到远程主机端口. ssh -L 本地主机端口:远程主机:远程主机端口 举例:ssh -L 50000:www.google.com:80 user ...

  7. tr 命令

    [root@localhost .txt abcdefg [root@localhost .txt |tr [a-z] [A-Z] ABCDEFG // 把文件小写字母变成大写字母

  8. 【剑指offer】二叉搜索树与双向链表

    一.题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二.思路: 对于一棵搜索二叉树来说,中序遍历得到的即是有序的结果,所以整 ...

  9. strlen函数细节

    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值. 原型: ...

  10. [py]Python使用UUID库生成唯一ID(uuid模块)

    https://www.cnblogs.com/dkblog/archive/2011/10/10/2205200.html uuid介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表 ...