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实现协同过滤的教程
Apr 08 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
python @property的用法及含义全面解析
Feb 01 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
详解python算法之冒泡排序
Mar 05 Python
python f-string式格式化听语音流程讲解
Jun 18 Python
python实现大文件分割与合并
Jul 22 Python
Java文件与类动手动脑实例详解
Nov 10 Python
python抓取多种类型的页面方法实例
Nov 20 Python
Python几种常见算法汇总
Jun 02 Python
python re.match()用法相关示例
Jan 27 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
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
php获取远程文件内容的函数
2015/11/02 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
python远程登录代码
2008/04/29 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
python实现百度语音识别api
2018/04/10 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
保险公司年会主持词
2014/03/22 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
大班幼儿评语大全
2014/04/30 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
青岛导游词
2015/02/12 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
新学期家长寄语2016
2015/12/03 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
Python+tkinter实现高清图片保存
2022/03/13 Python