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

银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系。此时银行职员就可以作为服务器,当用户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. 利用.NET Core类库System.Reflection.DispatchProxy实现简易Aop

    背景 Aop即是面向切面编程,众多Aop框架里Castle是最为人所知的,另外还有死去的Spring.NET,当然,.NET Core社区新秀AspectCore在性能与功能上都非常优秀,已经逐渐被社 ...

  2. TFS使用笔记

    TFS是用来存储文件的服务器,放置不同版本的文件.因此文件的数量和内容因版本不同而不同. 在Fig-00中,服务器和本地的对应文件夹Common下的因版本不一致,所以文件数量是不一致的. Fig-00 ...

  3. linux man指令问题

    linux man指令问题 2010-1-13 13:33 提问者: 钟离伊轩 man命令执行时,可加入数值,来限制帮助级别. 这句话对不对啊???? 我记得man page是分章节的..好像可以加数 ...

  4. Linux的ssh的known_host文件

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: WARNING: REMOTE HOST IDENTIFICATION HAS CHANG ...

  5. css3-鼠标经过产品列表 图片放大 显示文字 (兼容IE9以上 不含IE9)

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title&g ...

  6. 「CF741DArpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths」

    题目 这题目名字怎么这么长 zky学长讲过的题 非常显然,就是重排之后能形成回文串的话,最多只能有一个字母出现奇数次 又发现这个字符集大小只有\(22\),于是套路的使用状压,把每一条边转化成一个二进 ...

  7. 基于mysql的基准测试

    常用的基准测试工具介绍: mysql基准测试工具: mysqlslap,mysql自带的工具,对于性能测试不建议使用 特点: 可以模拟服务器负载,并输出相关统计信息 可以指定也可以自动生成查询语句 常 ...

  8. linux内核中网络文件系统的注册初始化

    针对内核3.9 系统开启时,会使用init/main.c,然后再里面调用kernel_init(),在里面会再调用do_basic_setup(),调用do_initcalls(),调用do_one_ ...

  9. Spring @Value 默认值

    @Value(value = "${etl.maxthreadcount:3}") private long MaxThreadCount;

  10. SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成ResultMap

    其实我一点都不想用mybatis,好多地方得自己写,比如这里. 使用mybatis要写大量的xml,烦的一批.最烦人的莫过于写各种resultmap,就是数据库字段和实体属性做映射.我认为这里应该是m ...