引入场景:客户与银行关系

银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系。此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关系的凭据。------简单的客户端/服务器架构模型。

客户端/服务器网络编程过程

  一:创建套接字(通信端点)

    AF_XXX解释:地址家族名称,AF:Address Family

     基于文件套接字

      AF_UNIX

    基于网络套接字

      AF_INET 代表ipv4  (python网络编程中常用的套接字)

        AF_INET6代表ipv6

        AF_NETLINK  允许使用标准的BSD套接字进行用户级别和内核级别代码之间的IPC (针对linux)

        AF_TIPC  允许计算机集群之中的机器相互通信,而无需使用基于ip的寻址 (针对linux)

  二:主机-端口对

      主机名和端口号组合用于填充套接字,使别人能准确寻址目标。 有效的端口号为0~65535。但有的端口号已经预留给了系统,自定义端口号时不能使用这些。系统预留端口号列表

  三:面向连接的套接字与无连接的套接字

     面向连接的套接字(SOCK_STREAM):通信之前必须建立一个连接,SOCK_STREAM提供序列化的、可靠的和不重复的数据交付,而没偶记录边界。换句话说就是每条信息都可以被拆分为多个片段,并且每条信息片段都确保能到达目的地,最后把完整的信息传递给等待的应用程序。实现这种类型连接的主要协议是传输控制协议(TCP),因为这些套接字的网络版是基于因特网协议IP来搜寻网络主机,所以整个系统通常结合这两种协议(tcp 和ip)来进行。简单点说就是tcp为信息提供了保障,ip为网络寻址提供服务。

    无连接的套接字(SOCK_DGRAM):无连接的套接字也叫数据报类型的套接字,意味在通信开始之前并不需要建立连接。此时在数据传输过程中并无法保证它的顺序性、可靠性或重复性,但数据报保留了记录边界,这就意味着消息是以整体发送的,而并非首先分个多个片段。实现这种连接类型的主要协议是用户数据报协议(UDP),网络版的寻址方式用的也是基于因特网协议IP来搜寻网络主机。所以整个系统通常以UDP/IP来进行。

      通过成本决定选用哪种套接字

    由于面向连接套接字所提供的保障(序列化、可靠和不重复的数据交付)所以它们的设置以及对虚拟电路连接的维护需要大量的开销,然而数据报不需要这些开销,即数据报套接字的成本较为“低廉”,因此能提供更好的性能并且适合一些类型的应用程序。但是用哪种套接字,要依赖于要完成哪些业务目标也就是依据任务来决定是用哪种套接字。

  Python中使用Socket模块实现连接通信

socket函数一般语法

 socket(socket_family(家族名称),socket_type(套接字类型),protocol=0(通常省略,默认为0))

一  :创建一个地址家族基于网络的,套接字类型为面向连接的socket,因为面向连接的套接字使用的是tcp协议,因此可以使用tcpSock命名

  

tcpSock=socket(AF_INET,SOCK_STREAM)

  二:创建一个地址家族基于网络的,套接字类型为无连接的socket,因为无连接的套接字使用的是UDP协议,因此可以使用udpSock命名

 udpSock=socket(AF_INET,SOCK_DGRAM)

常用套接字对象内置方法

名称 描述
服务器套接字方法
s.bind() 将地址(主机名、端口号)绑定到套接字上
s.listen() 设置并启动TCP监听器,参数为数值。数值表示最大监听数
s.accept() 被动接受TCP客户端连接,一直等待知道连接到达(阻塞)
客户端套接字方法  
s.connect() 主动发起TCP服务器连接
s.connect_ex() connect()的扩展版本,此时会议错误的形式返回问题,而不是抛出一个异常
普通的套接字方法
s.recv() 接收TCP消息
s.recv_into() 接收TCP消息到指定的缓冲区
s.send() 发送TCP消息
s.sendall() 完整的发送TCP消息
s.recvfrom() 接收UDP消息
s.recffrom_into() 接收UDP消息到指定缓冲区
s.sendto() 发送UDP消息
s.getpeername() 连接到套接字(TCP)的远程地址
s.getsockname() 当前套接字地址
s.getsocktop() 返回给定套接字指定的值
s.setsockopt() 设置给定套接字选项的值
s.shutdown() 关闭连接
s.close() 关闭套接字
s.ioctl() 控制套接字的模式(仅支持windows)
s.detach() 在未关闭文件描述符的情况下关闭套接字,返回文件描述符
面向阻塞的套接字方法
s.setblocking() 设置套接字的阻塞或非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 获取阻塞套接字操作的超时时间
面向文件的套接字方法
s.fileno() 套接字的文件描述符
s.makefile() 创建与套接字关联的文件对象
数据属性
s.family 套接字家族
s.type 套接字类型
s.proto 套接字协议

创建TCP服务器端和客户端使其通信,并在服务器端向客户端返回通信时间。(单线程版)

服务器端

 from socket import *
HOST=''
PORT=
BUFSIZ=
ADDR=(HOST,PORT)
tcpSerSock=socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen()
while True:
tcpClConn, addr = tcpSerSock.accept()
while True:
ret=tcpClConn.recv(BUFSIZ)
if ret==b'q':break
print(ret.decode('utf-8'))
msg = input('>>>').encode('utf-8')
tcpClConn.send(msg)
if msg.lower() == b'q': break
tcpClConn.close()
tcpSerSock.close()

客户端  

 from socket import *
HOST='127.0.0.1'
PORT=
BUFSIZ=
ADDR=(HOST,PORT)
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
msg=input('>>>').encode('utf-8')
tcpCliSock.send(msg)
ret = tcpCliSock.recv(BUFSIZ)
if msg.lower()==b'q':break
if ret.lower()==b'q':break
print(ret.decode('utf-8'))
tcpCliSock.close()

python学习之网络编程基础的更多相关文章

  1. python学习(20) 网络编程

    原文链接:http://www.limerence2017.com/2018/01/02/python20/ python 网络编程和基本的C语言编程一样,效率不是很高,如果为了封装通信库建议采用C/ ...

  2. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...

  3. python学习总结---网络编程

    网络编程 相关概念 - OSI七层模型:它从低到高分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. - TCP/IP: 在OSI七层模型基础上简化抽象出来的一套网络协议簇,现在得到 ...

  4. Python学习之==>网络编程

    一.什么是网络编程 使用Python进行网络编程,就是通过Python打开一个网站,或者请求一个http接口.可以通过标准模块urllib实现,也可以通过更简单易用的第三方模块requests实现. ...

  5. Python全栈-网络编程基础

    一.C/S架构 1.硬件C/S架构 如PC-打印机 2.软件C/S架构 如PC-网站服务器 参照: https://baike.baidu.com/item/Client%2FServer/15044 ...

  6. Python学习--19 网络编程

    TCP编程 Client 创建一个基于TCP连接的Socket: # coding: utf-8 import socket # 创建一个TCP连接: s = socket.socket(socket ...

  7. Java网络编程基础(Netty预备知识)

    今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...

  8. Python网络编程基础|百度网盘免费下载|零基础入门学习资料

    百度网盘免费下载:Python网络编程基础|零基础学习资料 提取码:k7a1 目录: 第1部分 底层网络 第1章 客户/服务器网络介绍 第2章 网络客户端 第3章 网络服务器 第4章 域名系统 第5章 ...

  9. python全栈开发从入门到放弃之socket网络编程基础

    网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

随机推荐

  1. 【Leetcode】【Easy】Isomorphic Strings

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  2. matlab 黑白格子

    有一个生成黑白格子的函数 40 这个参数是改变大小的 img=checkerboard(40)<0.5; figure; imshow(img,[])

  3. How to Remove A Service Entry From Win10 Service List

    Warning Please do this operation CAREFULLY, otherwise you may get something wrong with your system. ...

  4. HTTP协议图--与 HTTP 协作的 Web 服务器

    HTTP 通信时,除客户端和服务器外,还有一些用于协助通信的应用程序.如下列出比较重要的几个:代理.缓存.网关.隧道.Agent 代理. 1.代理   代理 HTTP 代理服务器是 Web 安全.应用 ...

  5. apt 安装 tomcat

    apt 安装 tomcat 直接使用 agt-get 安装 apt-get install tomcat7 # or apt-get install tomcat8 需要一段时间后就安装完成了. 安装 ...

  6. 内网渗透中的mimikatz

    0x00 前言 上篇测试了中间人攻击利用框架bettercap,这次挑选一款更具代表性的工具--mimikatz 0x01 简介 mimikatz,很多人称之为密码抓取神器,但在内网渗透中,远不止这么 ...

  7. Linux CPU的中断【转载】

    中断其实就是由硬件或软件所发送的一种称为IRQ(中断请求)的信号. 中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU. 一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且 ...

  8. Mac下的mongodb安装

    mac下的mongodb安装主要有两种方式,一是手工安装,需在官网下载源文件,二是通过homebrew,至于homebrew不做介绍.既然是Mac系统下,我认为直接通过homebrew安装最好,省事还 ...

  9. python open 追加

    今天操作失误,导致home目录没空间了,结果跑了3天的程序断了,还好代码可以重新运行. 读写的文件使用追加方式: # a # 打开一个文件用于追加(只写),写入内容为str # 如果该文件已存在,文件 ...

  10. Luogu_4886 快递员

    Luogu_4886 快递员 一道淀粉质的题目. 先考虑最简单的算法,那便是对每个点都求一边.时间复杂度O(NM) 然后如果我们把每个点的结果对应一个高度,我们会发现.最优解是在这个对应高度形成的三维 ...