ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端。

首先,导入Python中的socket模块: import socket

Python中的socket通信逻辑如下图所示(图片来自网络):

想要学习Python?Python学习交流群:660193417 满足你的需求,资料都已经上传群文件,可以自行下载!

这张逻辑图,是整个socket编程中的重点的重点,你必须将它理解、吃透,然后刻在脑海里,真正成为自己记忆的一部分!很多人说怎么都学不会socket编程,归根到底的原因就是没有“死记硬背”知识点。

在Python中,import socket后,用socket.socket()方法来创建套接字,语法格式如下:

sk = socket.socket([family[, type[, proto]]])

参数说明:

  • family: 套接字家族,可以使AF_UNIX或者AF_INET。
  • type: 套接字类型,根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM,也就是TCP和UDP的区别。
  • protocol: 一般不填默认为0。

直接socket.socket(),则全部使用默认值。

下面是具体的参数定义:

通过s = socket.socket()方法,我们可以获得一个socket对象s,也就是通常说的获取了一个“套接字”,该对象具有一下方法:

注意事项:

Python3以后,socket传递的都是bytes类型的数据,字符串需要先转换一下,string.encode()即可;另一端接收到的bytes数据想转换成字符串,只要bytes.decode()一下就可以。

在正常通信时,accept()和recv()方法都是阻塞的。所谓的阻塞,指的是程序会暂停在那,一直等到有数据过来。

socket编程思路:

服务端:

创建套接字,绑定套接字到本地IP与端口:socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()
开始监听连接:s.listen()
进入循环,不断接受客户端的连接请求:s.accept()
接收传来的数据,或者发送数据给对方:s.recv() , s.sendall()
传输完毕后,关闭套接字:s.close()

客户端:

创建套接字,连接服务器地址:socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()
连接后发送数据和接收数据:s.sendall(), s.recv()
传输完毕后,关闭套接字:s.close()
Python的socket编程,通常可分为TCP和UDP编程两种,前者是带连接的可靠传输服务,每次通信都要握手,结束传输也要挥手,数据会被检验,是使用最广的通用模式;后者是不带连接的传输服务,简单粗暴,不加控制和检查的一股脑将数据发送出去的方式,但是传输速度快,通常用于安全和可靠等级不高的业务场景,比如文件下载。

TCP编程

服务器端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
想要学习Python?Python学习交流群:660193417满足你的需求,资料都已经上传群文件,可以自行下载!
'''
import socketip_port = ('127.0.0.1', 9999)sk = socket.socket()            # 创建套接字
sk.bind(ip_port)                # 绑定服务地址
sk.listen(5)                    # 监听连接请求
print('启动socket服务,等待客户端连接...')
conn, address = sk.accept()     # 等待连接,此处自动阻塞
while True:     # 一个死循环,直到客户端发送‘exit’的信号,才关闭连接client_data = conn.recv(1024).decode()      # 接收信息if client_data == "exit":       # 判断是否退出连接exit("通信结束")print("来自%s的客户端向你发来信息:%s" % (address, client_data))conn.sendall('服务器已经收到你的信息'.encode())    # 回馈信息给客户端
conn.close()    # 关闭连接

客户端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-import socketip_port = ('127.0.0.1', 9999)s = socket.socket()     # 创建套接字s.connect(ip_port)      # 连接服务器while True:     # 通过一个死循环不断接收用户输入,并发送给服务器inp = input("请输入要发送的信息: ").strip()if not inp:     # 防止输入空信息,导致异常退出continues.sendall(inp.encode())if inp == "exit":   # 如果输入的是‘exit’,表示断开连接print("结束通信!")breakserver_reply = s.recv(1024).decode()print(server_reply)s.close()       # 关闭连接

上面这个例子,基本能够展示出socket通信的机制。套接字的创建和关闭,服务器的绑定和监听,客户端的连接,这些都是固定套路,没什么难点。关键之处在于循环内部的收发逻辑,这里才是重点,需要根据你自己的业务需求,正确编写。这个过程中,一定要注意,收发是一一对应的,有发就要有收,并且recv()方法默认是阻塞的。

大家可以在自己的环境中测试上面的例子,并加入更多的内容,不断地进行尝试。然而试过之后,你们会发现,虽然服务器和客户端在一对一的情况下,工作良好,但是,如果有多个客户端同时连接同一个服务器呢?结果可能不太令人满意,因为服务器无法同时对多个客户端提供服务。为什么会这样呢?因为Python的socket模块,默认情况下创建的是单进程单线程,同时只能处理一个连接请求,如果要实现多用户服务,那么需要使用多线程机制。

下面我们使用Python内置的threading模块,配合socket模块创建多线程服务器。客户端的代码不需要修改,可以继续使用。

#!/usr/bin/env python
# -*- coding:utf-8 -*-import socket
import threading        # 导入线程模块def link_handler(link, client):     """该函数为线程需要执行的函数,负责具体的服务器和客户端之间的通信工作:param link: 当前线程处理的连接:param client: 客户端ip和端口信息,一个二元元组:return: None"""print("服务器开始接收来自[%s:%s]的请求...." % (client[0], client[1]))while True:     # 利用一个死循环,保持和客户端的通信状态client_data = link.recv(1024).decode()if client_data == "exit":print("结束与[%s:%s]的通信..." % (client[0], client[1]))breakprint("来自[%s:%s]的客户端向你发来信息:%s" % (client[0], client[1], client_data))link.sendall('服务器已经收到你的信息'.encode())link.close()ip_port = ('127.0.0.1', 9999)
sk = socket.socket()            # 创建套接字
sk.bind(ip_port)                # 绑定服务地址
sk.listen(5)                    # 监听连接请求print('启动socket服务,等待客户端连接...')while True:     # 一个死循环,不断的接受客户端发来的连接请求conn, address = sk.accept()  # 等待连接,此处自动阻塞# 每当有新的连接过来,自动创建一个新的线程,# 并将连接对象和访问者的ip信息作为参数传递给线程的执行函数t = threading.Thread(target=link_handler, args=(conn, address))t.start()

启动这个多线程服务器,然后多运行几个客户端,可以很明显地看到,服务器能够同时与多个客户端通信,基本达到我们的目的。

UDP编程:
相对TCP编程,UDP编程就简单多了,当然可靠性和安全性也差很多。由于UDP没有握手和挥手的过程,因此accept()和connect()方法都不需要。下面是一个简单的例子:

# 服务端
import socket
ip_port = ('127.0.0.1', 9999)
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sk.bind(ip_port)while True:data = sk.recv(1024).strip().decode()print(data)if data == "exit":print("客户端主动断开连接!")breaksk.close()# 客户端
import socket
ip_port = ('127.0.0.1', 9999)sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
while True:inp = input('发送的消息:').strip()sk.sendto(inp.encode(), ip_port)if inp == 'exit':breaksk.close()

Python:socket编程教程相关推荐

  1. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*-"&qu ...

  2. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  3. python socket编程_Python Socket编程实现网络编程

    对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...

  4. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 发 ...

  5. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Socke ...

  6. python socket编程 实现简单p2p聊天程序

    转载自:https://www.cnblogs.com/wuxie1989/p/7204887.html python socket编程 实现简单p2p聊天程序 目标是写一个python的p2p聊天的 ...

  7. Python 并行编程教程 | Lynda教程 中文字幕

    Python 并行编程教程 | Lynda教程 中文字幕 Python Parallel Programming Solutions 课程ID: 604237 时长: 4.0小时 所属类别:Pytho ...

  8. 钻星图的c语言的编程,C 语言Socket编程教程 pdf

    南漳谬悠情节层析德雅青豆丹佛脉理密封.夺理秋月弹流清切壳菜夺得沙梨.临朐硕壮着迷僚婿母权欣欣气急波器,倒把迟迟供肥东辽电学片盘挂钟劈胸麦片!龙乡足板比美性病内屏:涣然树立马具闹哄啪唧每场水力儒艮: 励 ...

  9. pythonsocket自动化教程_Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. 基本上,Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏 ...

最新文章

  1. RNA-seq需要多长的读长?
  2. 算法导论Java实现-随机化数组的两种方式(5.3章节)
  3. WPF-MVVM学习心德(WinForm转WPF心德)
  4. php两段音频合成一个,两段音乐合并 如何将两段音乐合并成一个音乐文件
  5. 当我们谈论「Chatbot」时,我们在读什么? | 论文集精选 #05
  6. Flexbox兼容性语法汇总
  7. sonar 设置模板(Template)
  8. 在matlab中怎么录制音频_怎么录制淘宝页面中的视频?简单方法,轻松搞定
  9. 【Envi风暴】Envi5.4经典安装图文教程
  10. 关于国产科学软件的思考(转)
  11. 【kafka】kafka 控制台 消费报错 cant rebalance afer 4 retries
  12. 12年前的 Linux bug 复活,DNS 缓存投毒攻击重现
  13. 帆软报表帮助文档_给大家分享一款值得推荐的免费好用的web报表插件
  14. 中易云 易云系统 电镀废水处理远程监控解决方案
  15. Netty系列---源码实例
  16. 批处理 统计多个文件数量大小
  17. 程序员数学(9)--不等式与不等式组
  18. Android CardView使用详解
  19. 多张图片转成PDF文件
  20. 生活,本是一场修行!

热门文章

  1. vscode 单个文件夹的时候会折叠,解决办法
  2. 网易射击手游堡垒前线明日上线:创造加吃鸡模式你喜欢吗?
  3. css动画设置渐进渐出_具有srcset和CSS动画的渐进增强灯箱
  4. VR全景拍摄完整流程怎么拍?要记住哪些注意事项?
  5. 植物大战僵尸中文版修改器python实现
  6. 网络安全系列-XIV: 基于FCCX15数据集进行网络流量分析示例
  7. 荣耀九x升级鸿蒙,不会区别对待!荣耀老机型升级鸿蒙OS名单出炉!荣耀9X得到确认!...
  8. FL Studio2023水果音乐制作入门教程
  9. java 创建、删除文件夹
  10. 食物禁忌表(不仅吃出欢乐,更要吃出健康)