python实现socket简单通信的示例代码


Posted in Python onApril 13, 2021

首先先来简单介绍下socket:

(具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解。

socket是在应用层与传输层之间的一个抽象层,它的本质是编程接口,通过socket,才能实现TCP/IP协议。
它就是一个底层套件,用来处理最底层消息的接受和发送。
socket翻译为套接字,可以把TCP/IP复杂的操作抽象为简单的几个接口来供应用层调用来实现进程在网络中的通信。socket起源于Unix,而Unix的基本要素之一就是“一切都为文件”,即可以通过打开——读写——关闭的模式来操作,通过这一点我们就可以来实现socket的简单编写

这里再贴上关于socket工作原理的具体图像:

python实现socket简单通信的示例代码

大家若有看不懂的,也先别着急,看完下面的再来结合这张图理解会有更深的理解

其实在本机上,我们可以通过PID来标识唯一一个进程,但如果网络中的两个进程要进行通讯的话,PID的冲突就很大了,这个时候IP协议的ip地址就可以来标识主机,而TCP的协议与端口号可以标识主机的一个进程,所以就可以通过ip地址+协议+端口号来标识网络中的某个进程

大概了解的差不多了,我就来说说python里的socket库
先简单介绍一些socket库里的参数:
首先是地址蔟:

socket.AF_INET 表示的是IPv4(这也是socket里默认的)
socket.AF_INET6 表示的是IPv6
socket.AF_UNIX 这个主要用于单一的UNIX进程间的通信

然后是TYpe:

socket.SOCK_STREAM //流式socketTCP协议(默认的),用来保证数据顺序以及可靠性
socket.SOCK_DGRAM //这是报式socket UDP协议,保证数据接受的顺序,不可靠的连接
socket.SOCK_RAW //这是原始套接字,允许对底层协议(TCP/IP)直接访问

这里的流式与数据报式其实就是面向的区别:
流式是面向连接的TCP服务应用,而数据报式就是非面向连接的UDP服务应用,也就是无连接的socket

接着是一些方法的使用:

1:sk=socket.socket() :括号里面包含两个参数,一个参数默认是ip地址蔟的socket.AF_INET,也就是IPv4;还有一个默认是传输TCP协议,也就是socket.SOCK_STREAM
2:sk.bind(()) :最里面的括号里包含两个参数,分别是客户端的ip地址与端口号
3:sk.listen(n): 里面的n表示阻塞连接n个进程,也就是最大等待数为n个,当连接上某个进程后,其他的都不会连接上,会处于等待状态,只有当断开与这个进程的连接,其他的进程才会依次连上
4a,b=sk.accept():返回的是一个元组,元组的第一个参数是连接的信息,第二个参数是客户端的ip地址与端口号
5a.recv(1024): recv()表示接受信息,里面的1024表示最多接受的字节数,如果有多余的字符就下次再进行传输

大致的参数讲解完了,现在来开始服务端的脚本编写:

# -*-coding: utf-8 -*-
#引入socket库
import socket
#这是进行定义一个ip协议版本AF_INET(IPv4),定义一个传输TCP协议,SOCK_STREAM
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#定义ip地址与端口号,ip地址就是服务端的ip地址,端口随便定义,但要与客户端脚本一致
ip_port=('127.0.0.1',8000)
#绑定一个端口
sk.bind(ip_port)
#监听一个端口,这里的数字3是一个常量,表示阻塞3个连接,也就是最大等待数为3
sk.listen(3)
#接受客户端的数据,并返回两个参数,a为连接信息,b为客户端的ip地址与端口号
a,b=sk.accept()
print(a)
while True:
    data=a.recv(1024)#客户端发送的数据存储在recv里,1024指最大接受数据的量
    print(data.decode('utf-8'))
    message=input("you can say:")
    a.send(message.encode('utf-8'))
    if message==('bye'):
        break

接着来编写客户端的脚本:

# -*- coding:utf-8 -*-
#导入socket库
import socket
#定义一个ip协议版本AF_INET,为IPv4;同时也定义一个传输协议(TCP)SOCK_STREAM
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#定义IP地址与端口号
ip_port=('127.0.0.1',8000)
#进行连接服务器
client.connect(ip_port)
while True:
    message=input('You can say:')
    client.send(message.encode('utf-8'))#将发送的数据进行编码
    a=client.recv(1024)#接受服务端的信息,最大数据为1k
    print(a.decode('utf-8'))
    if a.decode('utf-8')=='bye':
        break

这是运行的结果

python实现socket简单通信的示例代码

左边窗口是服务端代码,右边窗口是客户端代码,当在服务端输入bye过后,整个对话将关闭

以上就是socket的简单通讯了

最后再讲讲UDP的专用代码(UDP与TCP的代码大致相同

sendto():这个函数用于在使用UDP时 发送数据
recvform():UDP专用,用于接受数据,返回数据远端的IP地址和端口
closc():关闭socket

大家若有兴趣可以自己去试试UDP的脚本实现,这里就不做具体示范啦

到此这篇关于python实现socket简单通信的示例代码的文章就介绍到这了,更多相关python socket通信内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Python使用pip安装pySerial串口通讯模块
Apr 20 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
pytorch查看通道数 维数 尺寸大小方式
May 26 Python
浅谈Python中的模块
Jun 10 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
python用字节处理文件实例讲解
Apr 13 #Python
Python中相见恨晚的技巧
Apr 13 #Python
利用python做表格数据处理
python glom模块的使用简介
Apr 13 #Python
Python的flask接收前台的ajax的post数据和get数据的方法
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
You might like
用Laravel轻松处理千万级数据的方法实现
2020/12/25 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
ReactRouter的实现方法
2021/01/25 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
Python自动登录126邮箱的方法
2015/07/10 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
爱与责任师德演讲稿
2014/08/26 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
工作失误检讨书范文
2015/01/26 职场文书
教师考核鉴定意见
2015/06/05 职场文书
投诉信回复范文
2015/07/03 职场文书
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android