Python网络编程(1)-socket

   我会在近期尽快更新好之前写的博客,会添加新的知识点和注意问题,排版和内容都会较之前有很大的改观,感谢大家一直的支持!

1、 客户端/服务器架构

  客户端/服务器架构也称主从式架构,简称C/S架构,它是一种网络结构,把客户端(Client)(通常是一个采用图形界面的程序)与服务器(server)区分开来,在C/S架构中,服务器是一系列的硬件或软件,客户端是提交服务请求的用户,客户端提供用户请求接口,服务端响应请求进行对应的处理,并返回给客户端。客户端/服务器架构既可以应用于计算机硬件,也可以应用于软件。

1.1、 硬件客户端/服务器架构

  典型的硬件客户端/服务器架构就是打印机,在企业中,员工通过局域网将个人电脑连接到打印机上,作为客户端向打印机发送打印请求,打印机作为服务端完成响应处理相应的请求。

1.2、 软件客户端/服务器架构

  软件服务器也是运行在硬件之上的,典型的软件服务器是Web服务器。在一台或多台电脑上搭建Web服务器,以提供用户访问所需的Web页面和应用程序,Web服务器一旦启动,都将可能永远运行,除非受到一些外力驱使才会停止,如人为关闭,服务器硬件故障等。它的工作就是接收客户端的请求,并响应请求给客户端返回相应的Web页面,然后等待下一个客户端的请求。

2、 套接字

  套接字是网络编程中的一个基本组件,如果想要服务器能够响应客户端发来的请求,首先要建立一个通信端点,使服务器能够监听服务,当通信端点建立后,就会进入无限循环的等待请求状态,当接收到客户端的请求,就会响应该请求。

  套接字就是两个程序之间的信息通道,可以理解为上面提到的“通信端点”的概念。在通信开始之前,网络应用程序必须创建套接字。套接字是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口号,远程主机的IP地址,远程进程的协议端口号。

  套接字起源于 20 世纪 70 年代,它是加利福尼亚大学伯克利分校版本的 Unix的一部分,即人们所说的 BSD Unix。 因此,套接字也被人们称为“伯克利套接字”或“BSD 套接字”。套接字最初被设计用于同一台主机上多个应用程序之间的通讯,这也就是所谓的进程间通讯(IPC)。

  TCP用主机的IP地址加上主机的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字用(IP地址:端口号)表示。

  套接字有两种类型,分别是基于文件的和基于网络的。

  基于文件的套接字家族名字叫做“AF_UNIX”,代表地址家族(address family):UNIX。在Unix和linux操作系统中,熟为人知的一句话就是:一切皆文件,一个或多个进程运行在同一台机器上,所以套接字是基于文件的,它就可以通过访问底层的基础结构来实现进程之间的通信

  基于网络的套接字家族名字叫做“AF_INET”,代表地址家族(address family):INET(因特网)。它使用IPv4进行通信,因为IPv4使用32位地址,相比于IPv6的128位来说,计算更快,更适合于局域网的通信。目前它也是使用最广泛的。

  在本文中,重点讲网络编程,所以在后面的涉及最多的还是AF_INET。

2.1、 流式套接字(SOCK_STREAM)

  不论使用哪种地址家族,都只有两种套接字的连接方式,一种是面向连接的,一种是无连接的。

  面向连接的套接字连接方式,意味着在进程通信之前必须先建立好一个连接,这种套接字就称为流式套接字。

  流式套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流式套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。在Python中,创建TCP套接字,就必须声明SOCK_STREAM作为套接字类型。

2.2、 数据报套接字(SOCK_DGRAM)

  数据报套接字提供了一种无连接的服务。这也意味着,使用这种连接方式不需要在进程通信前建立连接。在数据的传输过程中,SOCK_DGRAM并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

  虽然存在数据丢失、重复、数据无序接受等很多缺点,但它也有优势所在,在流式套接字中,因为是面向连接并提供了可靠的数据传输服务,这对于虚拟电路连接的维护需要很大的开销,但数据报套接字就不需要这些额外的开销,所以维护、资源占用成本更低。

3、 网络编程

  Python是一个很强大的网络编程工具,Python内有很多针对网络协议的库,这些库对网络协议的各个层次进行抽象封装,这对于程序员来说就意味着:不必关心网络协议的原理,只需要通过对程序的逻辑处理,就可以实现网络数据的传输。

3.1、 创建套接字

  在Python中,创建套接字需要使用socket模块,通过socket()函数创建套接字对象。

1 class socket(_socket.socket):
2         -- skip --
3         def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None):
4             -- skip --

  从socket函数的的构造方法中可以看出,可以指定地址家族和套接字的连接方式,proto默认是0,通常都省略。即创建套接字对象的时候:

  import socket

  #创建TCP/IP套接字,地址家族AF_INET

  tcp_socket = socket.socket(socket.AF_INET,socket.SOCKET_STREAM)

  #创建UDP/IP套接字,地址家族AF_INET

  udp_socket = socket.socket(socket.AF_INET,socket.SOCKET_DGRAM)

3.2、 套接字的内置方法

  常见的套接字内置函数

方法

功能

st.recv()

接受TCP的消息

st.recv_into()

接受TCP的消息到指定的缓存区

st.send()

 

发送TCP的消息(当待发送的消息量大于缓存区剩余内存时,数据会丢失)

st.sendall()

 

完整的发送TCP消息(当待发送的消息量大于缓存区剩余内存时,数据不会丢失,循环调用send 直到发完为止)

st.recvfrom()

接收UDP的消息

st.recvfrom_into()

接收UDP的消息到指定的缓存区

st.sendto()

发送UDP的消息

st.getpeername()

连接到套接字的远程地址(TCP)

st.getsockname()

获取当前套接字的地址

st.getsockopt()

获取指定套接字的参数

st.setsockopt()

设置指定套接字的参数

st.close()

关闭套接字

st.shutdown()

关闭连接

  服务端套接字方法

方法

功能

st.bind()

将IP地址+端口号绑定到套接字上

st.listen()

开启TCP监听功能

st.accept()

被动的接受TCP客户端的连接,(阻塞式)一直等待连接直到连接到达

  客户端套接字方法

方法

功能

st.connect()

主动发起TCP服务器连接

st.connect_ex()

connect()的扩展版本,以错误代码的形式返回问题,而不是抛出异常

      面向阻塞的套接字方法

方法

功能

st.setblocking()

设置套接字为阻塞模式或非阻塞模式

st.settimeout()

设置阻塞套接字的操作超时时间

st.gettimoout()

获取阻塞套接字的操作超时时间

    面向文件的套接字方法

方法

功能

st.fileno()

套接字的文件描述符

st.makefile()

创建与套接字相关联的文件对象

    数据属性

属性

功能

st.family

套接字家族

st.type

套接字类型

st.proto

套接字协议

3.3、 Tcp服务器和客户端的通信

  上面提到过,套接字对象都是通过socket.socket()函数来创建的,下面模拟一个TCP服务器和客户端,来实现进程间的通信。

  Tcp服务端:

 1 import socket
 2 tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  //创建服务器套接字
 3 tcp_server.bind(("127.0.0.1",8000))                           //将套接字与地址绑定
 4 tcp_server.listen(5)                                          //建立监听连接
 5 print("The server has started")
 6 while True:
 7     conn,addr= tcp_server.accept()                           //接受客户端的连接
 8     while True:
 9         try:
10             data = conn.recv(1024)                          //会话的接收(或发送)
11             print("msg is",data.decode("utf-8"))           //要将收到的会话数据进行解码
12             conn.send(data.title())                      //会话的发送(或接受)
13         except Exception:
14             break
15     conn.close()                                         //关闭连接
16 tcp_server.close()                                      //关闭服务器套接字

   在Tcp服务端,先创建服务器套接字并指定类型为流式套接字(SOCK_STREAM)。因为服务器需要占用一个端口并等待客户端的请求,所以它们必须绑定到一个本地地址。Tcp是一种面向连接的通信方式,所以必须建立监听连接,listen(5)的意义是允许传入连接的最大数为5个。当调用accept()函数后,服务端就会进入一个等待状态,默认情况下,accept()处于阻塞状态,也就意味着,执行到此处,程序会暂停,直到有新的连接到达,才会进行下一步的收发操作。

  Tcp客户端:

 1 import socket
 2 tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  //创建客户端套接字
 3 tcp_client.connect(("127.0.0.1",8000))                        //连接服务器
 4 while True:
 5     msg = input("Please input your message:").strip()
 6     if not msg:continue
 7     tcp_client.send(msg.encode("utf-8"))                      //会话接收(或发送)
 8     data = tcp_client.recv(1024)
 9     print("reply is",data.decode("utf-8"))
10 tcp_client.close()                                            //关闭客户端套接字

  创建客户端比服务端要简单很多,客户端一旦拥有了套接字,就可以利用套接字的connect()方法直接创建一个服务器的连接,建立好连接,就可以参与到服务端的会话中,当客户端的需求全部完成,就会关闭套接字,终止此次连接。

3.4、 Udp服务端和客户端的通信

  Udp服务器不需要Tcp服务器那么多的配置,因为它不是面向连接的,除了等待传入的连接,它基本不需要其他的操作。

  Udp服务端:

 1 import socket
 2 ip_port = ("127.0.0.1",8000)
 3 udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) //创建服务端套接字
 4 udp_server.bind(ip_port)                                    //绑定本地地址
 5 print("the server has started")
 6 while True:
 7     data,addr = udp_server.recvfrom(1024)                 //关闭接收(或发送)
 8     print(data)
 9     udp_server.sendto(data.title(),addr)                //关闭发送(或接受)
10     从上面代码中可以看出,除了创建套接字并绑定本地地址后,基本

  没有其它的操作,它是无连接的,这也就意味着,它无需为了成功通信而使一个客户端连接到一个“特定”的套接字进行转换操作,服务器端仅仅是接收数据并进行回复。

       Udp客户端:

1 import socket
2 ip_port = ("127.0.0.1",8000)
3 udp_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  //创建服务端套接字
4 while True:
5     msg = input(">>>").strip()
6     udp_client.sendto(msg.encode("utf-8"),ip_port)           //发送
7     data,addr = udp_client.recvfrom(1024)                   //接收
8     print(data)
9 udp_client.close()                                        //关闭套接字

    Udp客户端,一旦创建了套接字,就可以进行会话循环中,当会话结束,关闭套接字。

    在使用Udp进行通信的时候,服务端可以同时接收多个客户端的会话请求并返回请求结果。

转载于:https://www.cnblogs.com/Chen-Zhipeng/p/8472936.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Canvas之进度条的制作(矩形,圆环)

Canvas之进度条的绘制 基本进度条的绘制 1.矩形进度条 关键语法 获取画笔 var ctxdocument.getElementById(“id”).getContext(“2d”); 填充颜色 ctx.fillStytle“color”; setInternal()和clearInternal()的使用 代码(两种类型): <!DOCTYPE html> <html>…

该文件没有与之关联的程序来执行该操作_Liunx tty子系统分析之三 tty字符设备文件操作接口说明...

本章主要介绍tty字符设备文件对应的操作接口&#xff0c;从而说明tty设备的数据打开、关闭、读、写等接口的实现等内容。tyy file_operations定义tty字符设备文件操作接口的定义如下&#xff0c;主要包括tty_fops、console_fops、hung_up_tty_fops&#xff0c;其中console_fops…

jboss安装

找到压缩包 打开eclipse help 倒数第三个 找到hibernate.tools 转载于:https://www.cnblogs.com/xusongfeng/p/8473311.html

初学echart的简单使用

简单的echart使用方法 1.引入外部echart的js文件 <script type"text/javascript" src"js/echarts.min.js"></script> 2.建立放置容器&#xff0c;div使用放置容器布局 放置容器配置 <style>body {text-align: center;}#domain1 {widt…

如何编写一个python项目

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397616003925a3d157284cd24bc0952d6c4a7c9d8c55000 实战Day 1 - 搭建开发环境Day 2 - 编写数据库模块Day 3 - 编写ORMDay 4 - 编写ModelDay 5 - 编写Web框架Day 6 - 添加配置文件Day …

列名 userid 不明确。 表结构_那些你不知道的表结构设计思路

ERP表结构的设计--第9篇用日志记录“开源软件”的诞生赤龙ERP开源地址&#xff1a;点亮星标&#xff0c;感谢支持&#xff0c;与开发者交流 kzca2000码云&#xff1a;https://gitee.com/redragon/redragon-erpGitHub&#xff1a;https://github.com/redragon1985/redragon-erp赤…

echart的进阶使用(option)

echart的option进阶使用 1.title: { text: 折线图堆叠subtext: 有一定误差,left: center }title用来配置标题 subtext:副标题 left:位置 2.tooltip: { trigger: axis }图标的提示框组件 trigger&#xff08;触发方式&#xff09;:axis(坐标轴) item(数据项) 3.legend: {…

python找人_python之找最后一个人

题目大概是:有10个人围成一圈&#xff0c;从第一个人数&#xff0c;数到3的人出局&#xff0c;问最后一个人是谁?围成一圈&#xff0c;那就是无限循环&#xff0c;直至最后一个人&#xff0c;我们可以把10个人看做一个列表&#xff0c;每循环一次就把除3为0的数去除&#xff0…

PCL—关键点检测(rangeImage)低层次点云处理

博客转载自&#xff1a;http://www.cnblogs.com/ironstark/p/5046479.html 关键点又称为感兴趣的点&#xff0c;是低层次视觉通往高层次视觉的捷径&#xff0c;抑或是高层次感知对低层次处理手段的妥协。 ——三维视觉关键点检测 1.关键点&#xff0c;线&#xff0c;面 关键点 …

lombok的使用三部曲及使用中遇到的问题(持续更新)

lombok的使用 1.安装lombok插件 工欲善其事&#xff0c;必先利其器&#xff08;这一点是不能忘记的&#xff0c;好多小伙伴可能只导入了依赖&#xff0c;却忘了去下载安装插件&#xff09; 2.导入lombok依赖&#xff0c;看准了千万别倒错 导入依赖&#xff0c;记得更新PoM文件…

python gui 自动化_python GUI测试自动化

#! /usr/bin/env python#codingGB18030GUI测试自动化语言:python模块&#xff1a;pywinauto环境&#xff1a;windows7中文、python-2.6_32bit、pywinauto-0.40、SendKeys-0.3FuncName: pywinauto_notepad.pyDesc: study pywinautoDate: 2017-4-10 10:30Author: 雷小莫_codeHome…

Spring的使用——基础环境搭建以及IOC概念理解(持续更新)

spring基础环境搭建 1.添加Spring依赖 2.编写一个Spring的配置文件 3.通过Spring的应用程序应用上下文获取对象 优点:在修改方案时可以不用修改代码&#xff0c;只需修改配置文件的bean就可以。 spring的基本测试过程 1.获取上下文对象ctx ApplicationContext ctxnew Cl…

Windows10搭建FTP服务器

https://www.cnblogs.com/zjiacun/p/6868457.html 转载于:https://www.cnblogs.com/jonathanyue/p/9301195.html

详细设计说明书示例_专利说明书常用句型汇总

第六课 说明书常用句型1. 以上一般描述和以下的详细说明都只是本发明的示例&#xff0c;并旨在提供概况或框架&#xff0c;用来理解如本发明所主张的本发明的本质和特征。It is to be understood that both the foregoing general description and the following detailed desc…

Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build

解决步骤如下: 1.打开project下的build.grade 2.将jcenter()注释掉或者直接删除本行代码。 3.sync now

mysql 添加唯一索引_浅谈Mysql索引

文章原创于公众号&#xff1a;程序猿周先森。本平台不定时更新&#xff0c;喜欢我的文章&#xff0c;欢迎关注我的微信公众号。我们都知道&#xff0c;数据库索引可以帮助我们更加快速的找出符合的数据&#xff0c;但是如果不使用索引&#xff0c;Mysql则会从第一条开始查询&am…

Flask第一篇——URL详解

原创 2018-02-14 孟船长 自动化测试实战URL是Uniform Resource Locator的缩写&#xff0c;即统一资源定位符。 一个URL通常由一下几个部分组成&#xff1a; scheme://host:port/path/?query-stringxxx#anchor scheme&#xff1a;代表访问协议&#xff0c;一般为http&#xff0…

Linux优盘挂载卸载以及文件查看

1.插入优盘&#xff0c;连接到虚拟机 这一步差点整死我&#xff0c;老弹出这个也没在意&#xff0c;后来查看盘的时候找不到自己的优盘&#xff0c;傻眼了。 如果你的优盘也是3.0接口&#xff0c;那么请看3.0的正确打开方式: 找到虚拟机设置(我这里下载的是8.0版本的Centos&a…

mysql编程_PHP数据库编程之一MySQL优化策略概述

本文简单讲述了PHP数据库编程之MySQL优化策略。分享给大家供大家参考&#xff0c;具体如下&#xff1a;前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身&#xff0c;而在于数据库。我们都知道&#xff0c;PHP开发中&#xff0c;数据的增删改查是核心。为了提升PHP的运行…

mysql六:数据备份、pymysql模块

阅读目录 一 MySQL数据备份 二 pymysql模块 一 MySQL数据备份 #1. 物理备份&#xff1a; 直接复制数据库文件&#xff0c;适用于大型数据库环境。但不能恢复到异构系统中如Windows。 #2. 逻辑备份&#xff1a; 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中…