一、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. MyEvent.SetEvent; // 同步信号置位

    MyEvent.SetEvent;   //  同步信号置位 TSimpleEvent.Create = TEvent.Create(nil, True, False, nil)           ...

  2. SQL row_number() over(partition by函数

    1)row_number() over(partition by 列名1 order by 列名2 desc)的使用 表示根据 列名1 分组,然后在分组内部根据 列名2 排序,而此函数计算的值就表示每 ...

  3. python作用域问题

    今天出了个低级的错误,最后确定是作用域问题,特回顾知识点如下: 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域. Python的作 ...

  4. selenium如何定位同级节点

    场景:当定位某个元素时,发现所需要的元素在同级节点,可以用/following-sibling::*  方法(定位同级的第二位)    当定位统计节点的第二个定位相邻节点. 可以用/preceding ...

  5. AT2567 RGB Sequence dp

    正解:计数dp 解题报告: 传送门! umm其实我jio得dp的题目的话就难在思想昂,,,知道状态知道转移就不难辣QAQ 所以就不说别的了直接写下思路放下代码就over辣QAQ 最基础的思想就是f[i ...

  6. 这个zsh超级棒

    https://github.com/robbyrussell/oh-my-zsh wget用法: http://man.linuxde.net/wget https://pan.baidu.com/ ...

  7. js对json格式对象进行增加,修改,删除

    // 假设数据为data var data=[ { "ID":"83d349de-eca4-4974-a8a7-f9b44b48c6f2", "IsL ...

  8. C++取出string的一部分以及int型转成string类型

    在实际应用中,对文件的操作是十分频繁的,我们需要对文件进行拷贝,重命名等操作,这是就需要获取文件的绝对路径,一般情况下,该路径是以字符串的形式存储的,如果我们需要对文件进行重命名等,就需要对绝对路径这 ...

  9. 理解Spark里的闭包

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80650309 闭包的概念例如以下图: ...

  10. NginxI/O模型理论基础

    I/O模型介绍 同步IO 关注的是消息通信机制  调用者需要等待被调用者先执行完毕才能往下继续执行   被调用者在执行完自己的任务后并不会同之调用者执行结果需要调用者自己去获取被调用者的执行状态 异步 ...