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函数一般语法

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

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

  

tcpSock=socket(AF_INET,SOCK_STREAM)

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

1 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服务器端和客户端使其通信,并在服务器端向客户端返回通信时间。(单线程版)

服务器端

 1 from socket import *
 2 HOST=‘‘
 3 PORT=21567
 4 BUFSIZ=1024
 5 ADDR=(HOST,PORT)
 6 tcpSerSock=socket(AF_INET,SOCK_STREAM)
 7 tcpSerSock.bind(ADDR)
 8 tcpSerSock.listen(5)
 9 while True:
10     tcpClConn, addr = tcpSerSock.accept()
11     while True:
12         ret=tcpClConn.recv(BUFSIZ)
13         if ret==b‘q‘:break
14         print(ret.decode(‘utf-8‘))
15         msg = input(‘>>>‘).encode(‘utf-8‘)
16         tcpClConn.send(msg)
17         if msg.lower() == b‘q‘: break
18     tcpClConn.close()
19 tcpSerSock.close()

客户端  

 1 from socket import *
 2 HOST=‘127.0.0.1‘
 3 PORT=21567
 4 BUFSIZ=1024
 5 ADDR=(HOST,PORT)
 6 tcpCliSock=socket(AF_INET,SOCK_STREAM)
 7 tcpCliSock.connect(ADDR)
 8 while True:
 9     msg=input(‘>>>‘).encode(‘utf-8‘)
10     tcpCliSock.send(msg)
11     ret = tcpCliSock.recv(BUFSIZ)
12     if msg.lower()==b‘q‘:break
13     if ret.lower()==b‘q‘:break
14     print(ret.decode(‘utf-8‘))
15 tcpCliSock.close()

原文地址:https://www.cnblogs.com/SunIan/p/9850981.html

时间: 2024-09-30 16:33:31

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

python学习之网络编程

一.socket模块     socket模块提供了底层的接口,通过socket模块可以实现不同计算机的通信     ip+port定位了计算机中应用程序的具体位置,socket绑定ip+port来建立链接,socket的方法详情:     socket(family, type, proto): socket函数创建一个socket对象,使用socket对象创建连接,     family协议族,默认AF_INET,ipv4协议,type,socket类型,proto协议类型         

【python学习】网络爬虫——基础案例教程

一,获取整个页面数据 Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据.首先,我们定义了一个getHtml()函数: urllib.urlopen()方法用于打开一个URL地址. read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来.执行程序就会把整个网页打印输出. #coding=utf-8 import urllib def getHtml(url):     page = urllib.ur

python开发socket网络编程基础:粘包问题&udp套接字

一,发生粘包 服务器端 1 from socket import * 2 phone=socket(AF_INET,SOCK_STREAM) #套接字 3 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 4 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 5 phone.listen(5) 6 conn,client_addr=phone.accept() #等待tcp接受 7 8 9 # data1

python 学习5 网络编程-TCP/UDP

摘抄自:廖雪峰的官方网站:http://www.liaoxuefeng.com/ TCP客户端和服务器端代码: #coding=utf-8 #客户端程序TCP 连接 import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',9999)) print(s.recv(1024)) for data in ['Michael','Tracy','Sarah']: s.send(data

Java:进阶学习(1)——网络编程

Java:进阶学习(1)--网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket方法 getInetAddress();    远程服务端的IP地址 getPort();    远程服务端的端口 getLocalAddress()    本地客户端的IP地址 getLocalPort()    本地客户端的端口 getInputStream();   

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

网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 为何学习socket一定要先学习互联网协议: 1.首先:本节课程的目标就是教会你如何基于socket编程,来开发一款自己的C/S架构软件 2.其次:C/S架构的

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

Day3: Python学习笔记之计算机基础——网络片

Day3: Python学习笔记之计算机基础--网络片 什么是互联网协议以及为何要有互联网协议? ?互联网协议本质上是为了方便连接两台计算机而指定的一系列统一的标准. osi五层模型 计算机之间要实现数据传输必须要经过以下五层协议: ? 模型 ,协议 ,硬件 ? 应用层, http协议.用户自定义协议 ? 传输层, TCP/UPD协议 ,四层交换机.四层路由器 ? 网络层, IP协议, 三层交换机.路由器 ? 数据链路层, 以太网.电信号分组, 网桥.以太网交换机.网卡 ? 物理层, 传递电信号

java基础学习总结——网络编程

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——网络编程 一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程. 二.网络通信协议及接口 三.通信协议分层思想 四.参考模型 五.IP协议 每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了. IP地址是用一个点来分成四段的,在计算机内部IP地址是用四个字节来表示的,一个字节代表一段,每一个字节代表的数最大只能到达255. 六.TCP协议和UD