关于Python Socket编程的要点详解

目录
  • 前言
  • 什么是socket?
  • 如何在 Python 中创建 socket 对象?
  • Python 的套接字库中有多少种可用的套接字方法?
    • 服务器套接字可用的方法有哪些?
    • 客户端套接字可用的方法有哪些?
    • Python中可用的通用套接字方法有哪些?
  • Python Socket 编程工作流程
  • Python 客户端-服务器通信示例代码
    • Python-Server.py
    • Python-Client.py
    • 如何运行客户端-服务器程序?
    • 检查程序兼容性
  • 快速总结——Python Socket 编程
  • 总结

前言

在今天的教程中,我们将介绍python基础知识的Python的socket编程。Python 的socket接口类似于 C 和 Java。因此,如果您已经具有 C/Java 编程背景,那么在 Python 中学习socket编程会容易得多。

但是在 Python 中使用socket要简单得多,这鼓励了快速的应用程序开发。所以,不要担心 Python 是否是你的第一门编程语言,而是应该感到幸运。

Python 提供了两种类型的 API 库,可用于socket编程。在底层,Python 利用“ socket ”library为无连接和面向连接的网络协议实现客户端和服务器模块。而在更高级别,您可以使用ftplib和httplib等库 与应用程序级网络协议(如 FTP 和 HTTP)交互。

在这篇文章中,我们将讨论专为 Python socket 编程而设计的最广泛使用的 “socket ” 库。我们将介绍该库提供的主要功能,这些功能可以帮助您构建客户端和服务器模块。最后,您将通过示例代码看到客户端-服务器通信的演示。

socket是学习 Python socket编程需要了解的最重要和最基本的实体。在本节中,我们介绍了socket的概念以及创建socket并与之通信的相关方法。

Python Socket 编程简述

什么是socket?

socket 是双向通信链路的端点。端点是 IP 地址和端口号的组合。

对于Client-Server通信,需要在两端配置socket来发起连接,监听传入的消息,然后在两端发送响应,从而建立双向通信。

socket 允许位于同一台机器上的进程之间进行通信,或者在不同环境中工作的不同机器上甚至跨越不同大陆的进程之间进行通信。

如何在 Python 中创建 socket 对象?

要创建/初始化socket,我们使用socket.socket() 方法。它在 Python 的socket模块中有定义。其语法如下。

sock_obj = socket.socket(socket_family, socket_type, protocol=0)

在哪里,

  • socket_family: 定义用作传输机制的协议族。它可以具有两个值中的任何一个。

    • AF_UNIX,或
    • AF_INET(IP 版本 4 或 IPv4)。
  • socket_type: 定义两个端点之间的通信类型。它可以具有以下值。
    • SOCK_STREAM(用于面向连接的协议,例如 TCP),或
    • SOCK_DGRAM(用于无连接协议,例如 UDP)。
  • 协议: 我们通常保留此字段或将此字段设置为零。
import socket   #for sockets

#实例化一个AF_INET, STREAM socket (TCP)

sock_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print ('Socket Initialized')

这就是创建套接字对象的方法。但是如果上面的例子无法实例化套接字怎么办。您将如何解决错误?

您需要将上述代码包装在 Python 的 try 和 except 块中。通过 Python 异常处理,您可以追踪错误的原因。

#管理python套接字编程中的错误

import socket   #for sockets
import sys  #for exit

try:
    #创建一个 AF_INET, STREAM 套接字 (TCP)

    sock_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as err_msg:
    print ('Unable to instantiate socket. Error code: ' + str(err_msg[0]) + ' , Error message : ' + err_msg[1])
    sys.exit();

print ('Socket Initialized')

在接下来的部分中,我们将解释 Socket 库中可用的函数来创建客户端/服务器程序。

Python 的套接字库中有多少种可用的套接字方法?

我们可以将用于 Python 套接字编程的套接字方法分为以下三类。

  • 服务器套接字方法,
  • 客户端套接字方法,以及
  • 通用套接字方法。

服务器套接字可用的方法有哪些?

服务器套接字方法

  • sock_object.bind(地址):

    • 此方法将套接字绑定到地址(主机名、端口号对)
  • sock_object.listen(积压):
    • 此方法用于侦听与套接字关联的连接。
    • backlog 参数表示排队连接的最大数量。
    • 最大值可以达到 5,最小值应该至少为零。
  • sock_object.accept():
    • 此函数返回 (conn, address) 对,其中“conn”是用于在通信通道上发送和接收数据的新套接字对象,“address”是与通道另一端的套接字绑定的 IP 地址。
    • ACCEPT() 方法返回一个套接字对象,它不同于使用 socket.socket() 创建的套接字对象。
    • 这个新的套接字对象专门用于管理与发生接受的特定客户端的通信。
    • 这种机制还帮助服务器同时保持与 n 个客户端的连接。

客户端套接字可用的方法有哪些?

客户端套接字方法

  • sock_object.connect():

    • 此方法用于将客户端连接到主机和端口,并启动与服务器的连接。

Python中可用的通用套接字方法有哪些?

通用套接字方法

  • sock_object.recv():

    • 当协议参数的值为 TCP 时,使用此方法在端点接收消息。
  • sock_object.send():
    • 如果协议是 TCP,则应用此方法从端点发送消息。
  • sock_object.recvfrom():
    • 如果使用的协议是 UDP,则调用此方法以在端点接收消息。
  • sock_object.sendto():
    • 如果协议参数为 UDP,则调用此方法以从端点发送消息。
  • sock_object.gethostname():
    • 此方法返回主机名。
  • sock_object.close():
    • 此方法用于关闭套接字。远程端点不会从这一端接收数据。

到目前为止,我们已经列出了“ socket ”库为 Python 套接字编程提供的所有套接字工具。接下来,我们将向您展示实现客户端-服务器通信的套接字函数调用工作流程。请参考以下快照。它说明了在客户端和服务器之间建立通道所需的每个套接字调用。

Python Socket 编程工作流程

下图描述了客户端和服务器端点的套接字方法的调用顺序。

因此,从上面的流程图中,您将了解在 Python 中创建客户端/服务器套接字程序所需的所有套接字方法。现在是时候设置真正的 Python 客户端和服务器组件了。

Python 客户端-服务器通信示例代码

客户端-服务器程序将具有以下两个 Python 模块。

  • Python-Server.py 和
  • Python-Client.py。

让我们先检查一下服务器代码。请注意,我们已经在 Python 3 上测试了此代码。

Python-Server.py

该服务器模块将向/从客户端发送和接收数据。

Python-Server.py 文件包含创建服务器套接字的代码,该套接字在收到来自客户端的请求之前一直处于等待状态。

每当客户端连接时,服务器都会接受该连接。

  • 然后客户端将开始向服务器传递消息。
  • 服务器将处理这些消息并将响应发送回客户端。

在下面的代码中,我们还要求用户输入他想要传递给客户端的响应。

import socket
import time

def Main():
    host = "127.0.0.1"
    port = 5001

    mySocket = socket.socket()
    mySocket.bind((host,port))

    mySocket.listen(1)
    conn, addr = mySocket.accept()
    print ("Connection from: " + str(addr))

    while True:
        data = conn.recv(1024).decode()
        if not data:
            break
        print ("from connected  user: " + str(data))

        data = str(data).upper()
        print ("Received from User: " + str(data))

        data = input(" ? ")
        conn.send(data.encode())

    conn.close()

if __name__ == '__main__':
    Main()

Python-Client.py

在客户端,我们创建一个套接字并使用提供的主机和端口值连接到服务器。

  • 客户端代码有一个用于交换消息的 while 循环。它不断打印从服务器获得的所有数据。
  • 在此之后,会调用输入函数来请求客户端响应。然后将响应传递给服务器。
  • 用户还可以在任何时间点输入“q”来停止通信。
import socket

def Main():
    host = '127.0.0.1'
    port = 5001

    mySocket = socket.socket()
    mySocket.connect((host,port))

    message = input(" ? ")

    while message != 'q':
        mySocket.send(message.encode())
	data = mySocket.recv(1024).decode()

	print ('Received from server: ' + data)
	message = input(" ? ")

    mySocket.close()

if __name__ == '__main__':
    Main()

如何运行客户端-服务器程序?

您需要从单独的命令窗口运行这两个模块,或者您可以在两个不同的 IDLE 实例中运行它们。

首先,您将执行服务器模块,然后是客户端。我们已经给出了客户端-服务器程序的完整执行摘要。

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.

 RESTART: C:\Users\Techbeamers\AppData\Local\Programs\Python\Python35\Python-Server.py
Connection from: ('127.0.0.1', 50001)
from connected  user: Hello TechBeamers
Received from User: HELLO TECHBEAMERS
 ? Hello Dear Reader
from connected  user: You posts are awesome :)
Received from User: YOU POSTS ARE AWESOME :)
 ? Thank you very much. This is what keeps us motivated.
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.

 RESTART: C:\Users\Techbeamers\AppData\Local\Programs\Python\Python35\Python-Client.py
 ? Hello TechBeamers

Received from server: Hello Dear Reader
 ? You posts are awesome :)

Received from server: Thank you very much. This is what keeps us motivated.
 ? q

检查程序兼容性

请注意,我们已经使用 Python 3 版本测试了上述客户端-服务器代码。但是您可以轻松地将上述代码转换为在 Python 2.7 上运行。您需要替换以下代码行。

data = input(" ? ")

对 Python 2.7使用以下 Python输入函数。

data = raw_input(" ? ")

我们在以下几点中列出了更多差异。

  • Python 2.7 中的一些其他函数(如打印)不需要封闭大括号。
  • Python 2.7 的 socket 函数(如 send()/recv() )都不需要解码它们的返回值,而 Python 3 需要它。

快速总结——Python Socket 编程

我们希望上面的教程能让您了解有关 Python 套接字编程的新知识。如果您喜欢这篇文章并有兴趣看到更多此类文章,可以看看这里(Github/Gitee) 关注我以查看更多信息,这里汇总了我的全部原创及作品源码

总结

到此这篇关于Python Socket编程要点的文章就介绍到这了,更多相关Python Socket编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Socket编程详细介绍

    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦.并且网上也没找到太好的封装,所以就自己写了个简单的封装. 封装思路 1. 客户端每次请求均发送一个 SocketRequest 对象,其中封装具体的数据,这里使用json.对于要发送的数据,会自动添加一个结束符标识(EOF = '0x00'). 2. 服务器端接收数据时,根据结束符标识来生成完整的数据,并解包成 SocketRequest 对象. 3. 服务器端根据

  • 最基础的Python的socket编程入门教程

    本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下. Python的socket功能封装在socket库中,要使用socket,记得先import socket,socket库的详细介绍参见官方文档. 创建Socket 首先创建一个socket,使用socket库中得socket函数创建. import socket # create an INET, STREAM soc

  • python网络编程学习笔记(五):socket的一些补充

    1.半开放socket 利用shutdown()函数使socket双向数据传输变为单向数据传输.shutdown()需要一个单独的参数,该参数表示了如何关闭socket.具体为:0表示禁止将来读:1 表示禁止将来写:2表示禁止将来读和写. 2.timeouts控制超时 调用socket的settimeout()函数,向其传递参数,表明超时时间设置.当访问一个socket,如果经过了参数设定的时间后,什么都没有发生,则会产生一个socket.timeout异常.例如:当程序运行后,会等待数据传入.

  • Python socket编程实例详解

    本文实例形式较为详细的讲述了Python socket编程.分享给大家供大家参考.具体如下: 复制代码 代码如下: sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 上面的代码创建了一个socket对象.type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字).AF_INET表示创建的是ip v4的类型. 复制代码 代码如下: socket(address_family,type,proto

  • 详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用Python 进行TCP Socket 网络编程,假设你已经具

  • python之Socket网络编程详解

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享.网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 网络通信的三要素 IP地址 用来表示一台独立的主机 特殊的IP地址 127.0.0.1或称localhost(表示本地回环

  • Python 网络编程起步(Socket发送消息)

    一.服务端(Server.py)    服务端要做的事情是:    1. 创建一个Socket对象 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    2. 绑定一个端口 Code highlighting pro

  • Python Socket编程入门教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs.python.org/library/socket.html 基本上,Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器地址栏中输入 www.jb51.net 时,你会打开一个套接字,然后连接到 www.jb51.net 并读取响应的页面然后然后显示出来.而其他一些聊天客户端如

  • python多线程socket编程之多客户端接入

    Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用,如下: 1.客户端 #!/usr/bin/env python #coding:utf-8 ''' file:client.py date:9/9/17 3:43 PM author:lockey email:lockey@123.com desc:socket编程客户端,python3.6.2 ''' import socket,sys HOST =

  • 关于Python Socket编程的要点详解

    目录 前言 什么是socket? 如何在 Python 中创建 socket 对象? Python 的套接字库中有多少种可用的套接字方法? 服务器套接字可用的方法有哪些? 客户端套接字可用的方法有哪些? Python中可用的通用套接字方法有哪些? Python Socket 编程工作流程 Python 客户端-服务器通信示例代码 Python-Server.py Python-Client.py 如何运行客户端-服务器程序? 检查程序兼容性 快速总结--Python Socket 编程 总结 前

  • Python socket模块方法实现详解

    这篇文章主要介绍了Python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方法) #! /usr/bin/env python # -*- coding:utf-8 -*- # Author Ian Ying # mail: kongqing.ying@yitu-inc.com import socket import os server = socket.socket()

  • Java使用线程池实现socket编程的方法详解

    目录 前言 一.一个简单的C/S模型实现 1.服务器: 2.客户端: 二.线程池使用方法 1.新建一个线程池 2.用Runnable接口实现线程 3.创建线程对象并提交至线程池执行 三.结合起来 四.使用新的输入输出流 总结 前言 以多个客户端和一个服务端的socket通信为例,服务端启动时创建一个固定大小的线程池.服务端每接收到一个连接请求后(通信任务),交给线程池执行,任务类实现了Runnable接口,用于跟客户端进行读写操作,该类的对象作为任务通过execute(Runnable task

  • python网络编程之进程详解

    目录 1.进程 1.1进程: 1.2在python中创建进程 1.3 使用multiprocessing创建进程 1.3.1 单个进程时: 1.3.2 多个子进程时: 1.3.3 自定义进程类方法 使用Process子类创建进程Process(target=test)实现多进程,复杂的要定义一个类继承Process,每次实例化这个类的时候就等同于实例化一个进程对象 1.4 Pool进程池 2. 验证进程是否能共享信息 2.1 Queue(队列)模块: 2.1.1 队列简介: 2.2 实现进程间的

  • Python Socket编程详解

    背景 关于Python Socket编程,首先需要了解几个计算机网络的知识,通过以下的几个问题,有助于更好的理解Socket编程的意义,以及整个框架方面的知识: TCP和UDP协议本质上的区别? TCP协议,面向连接,可靠,基于字节流的传输层通信协议:UDP协议无连接,不可靠,基于数据包的传输层协议. TCP协议在建立连接的过程需要经历三次握手,断开连接则需要经历四次挥手,而这建立连接的过程增加了传输过程中的安全性. 而建立连接的过程则会消耗系统的资源,消耗更多的时间,而相比较UDP协议传输过程

  • python基础之Socket套接字详解

    前言 Python语言提供了Socket套接字来实现网络通信. Python的应用程序通常通过Socket"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 服务器和客户端的源代码 服务器端 #coding=utf-8 #创建TCP服务器 import socket import time from time import ctime HOST = '127.0.0.1' PORT = 8080 BUFSIZE=1024 sock = socket.s

  • python多线程和多进程关系详解

    关于多线程的大概讲解: 在Python的标准库中给出了2个模块:_thread和threading,_thread是低级模块不支持守护线程,当主线程退出了时,全部子线程都会被强制退出了.而threading是高级模块,用作对_thread进行了封装支持守护线程.在大部分状况下人们只需要采用threading这个高级模块即可. 关于多进程的大概讲解: 多进程是multiprocessing模块给出远程与本地的并发,在一个multiprocessing库的采用场景下,全部的子进程全是由一个父进程运行

  • Python探索之ModelForm代码详解

    这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平. 先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢? 首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后天一个一个接收用户的输入,创建一个新的学生对象,保存 其实,重点不是这些,而是合法性验证,我们需要在前端

  • Python实现简易Web爬虫详解

    简介: 网络爬虫(又被称为网页蜘蛛),网络机器人,是一种按照一定的规则,自动地抓信息的程序或者脚本.假设互联网是一张很大的蜘蛛网,每个页面之间都通过超链接这根线相互连接,那么我们的爬虫小程序就能够通过这些线不断的搜寻到新的网页. Python作为一种代表简单主义思想的解释型.面向对象.功能强大的高级编程语言.它语法简洁并且具有动态数据类型和高层次的抽象数据结构,这使得它具有良好的跨平台特性,特别适用于爬虫等程序的实现,此外Python还提供了例如Spyder这样的爬虫框架,BeautifulSo

随机推荐