python学习之网络编程基础
引入场景:客户与银行关系

银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系。此时银行职员就可以作为服务器,当用户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学习之网络编程基础的更多相关文章
- python学习(20) 网络编程
原文链接:http://www.limerence2017.com/2018/01/02/python20/ python 网络编程和基本的C语言编程一样,效率不是很高,如果为了封装通信库建议采用C/ ...
- python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...
- python学习总结---网络编程
网络编程 相关概念 - OSI七层模型:它从低到高分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. - TCP/IP: 在OSI七层模型基础上简化抽象出来的一套网络协议簇,现在得到 ...
- Python学习之==>网络编程
一.什么是网络编程 使用Python进行网络编程,就是通过Python打开一个网站,或者请求一个http接口.可以通过标准模块urllib实现,也可以通过更简单易用的第三方模块requests实现. ...
- Python全栈-网络编程基础
一.C/S架构 1.硬件C/S架构 如PC-打印机 2.软件C/S架构 如PC-网站服务器 参照: https://baike.baidu.com/item/Client%2FServer/15044 ...
- Python学习--19 网络编程
TCP编程 Client 创建一个基于TCP连接的Socket: # coding: utf-8 import socket # 创建一个TCP连接: s = socket.socket(socket ...
- Java网络编程基础(Netty预备知识)
今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...
- Python网络编程基础|百度网盘免费下载|零基础入门学习资料
百度网盘免费下载:Python网络编程基础|零基础学习资料 提取码:k7a1 目录: 第1部分 底层网络 第1章 客户/服务器网络介绍 第2章 网络客户端 第3章 网络服务器 第4章 域名系统 第5章 ...
- python全栈开发从入门到放弃之socket网络编程基础
网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...
随机推荐
- 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...
- Git分布式工作流程
Git官网给出了三种分布式工作流程: 集中式工作流程 集成管理者工作流 司令官与副官工作流 这里以私有gitserver服务器上的git-test项目为例,简单说明集中式工作流程. 基于分支的开发策略 ...
- React学习笔记(六)事件处理
React学习笔记(六) 五.事件处理 React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写. 如果采用JSX的语法,事件函数需要用大括号{}包裹函数名,不同于传统DOM字符串小括号的方 ...
- 第一个c程序和vs2017 在打开MFC rc文件时找不到rcdll.dl
第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...
- Java学习---InetAddress类的学习
基础知识 1.InetAddress类 在网络API套接字,InetAddress类和它的子类型对象使用域名DNS系统,处理主机名到主机IPv4或IPv6地址的转换.如图1-1所示. 由于InetAd ...
- Mysql学习---使用Python执行存储过程
使用Python执行存储过程 使用Python执行存储过程[2部分]: 1.执行存储过程,获取存储过程的结果集 2.将返回值设置给了 @_存储过程名_序号 = #!/usr/bin/env pyt ...
- nohup使用相关知识
常规用法nohup ./abc.sh > abc.out & --输出nohup的日志到abc.outnohup ./abc.sh & ...
- C/S结构软件测试要点汇总
C/S结构测试要点 1.安装/卸载: 1.安装包:完整性,安装包大小是否达到要求,显示基本信息是否正确,步骤是否明确,内容是否合理. 2.首次安装: 1)是否与其他已安装的软件冲突. 2)各种杀毒 ...
- mac使用指南--软件安装部分
最近因为开发需要,换了个mac,发现和Windows下面的操作和习惯真是千差万别啊,在这里记录一下,有需要的也可以参考一下. 安装前强烈建议根据个人习惯设置好触控板!!!什么单击双击选中拖拽的统统设好 ...
- JavaScript权威指南第03章 类型、值和变量(1)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/huangbin10025/article/details/27953481 类型.值和变量 数据类型 ...