python如何实现socket简单通信
这篇文章将为大家详细讲解有关python如何实现socket简单通信,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
首先先来简单介绍下socket:
(具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解。
socket是在应用层与传输层之间的一个抽象层,它的本质是编程接口,通过socket,才能实现TCP/IP协议。
它就是一个底层套件,用来处理最底层消息的接受和发送。
socket翻译为套接字,可以把TCP/IP复杂的操作抽象为简单的几个接口来供应用层调用来实现进程在网络中的通信。socket起源于Unix,而Unix的基本要素之一就是“一切都为文件”,即可以通过打开——读写——关闭的模式来操作,通过这一点我们就可以来实现socket的简单编写
这里再贴上关于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
接着是一些方法的使用:
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_STREAMsk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#定义ip地址与端口号,ip地址就是服务端的ip地址,端口随便定义,但要与客户端脚本一致ip_port=('127.0.0.1',8000)#绑定一个端口sk.bind(ip_port)#监听一个端口,这里的数字3是一个常量,表示阻塞3个连接,也就是最大等待数为3sk.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_STREAMclient=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
这是运行的结果
左边窗口是服务端代码,右边窗口是客户端代码,当在服务端输入bye过后,整个对话将关闭
以上就是socket的简单通讯了
最后再讲讲UDP的专用代码(UDP与TCP的代码大致相同
sendto():这个函数用于在使用UDP时 发送数据
recvform():UDP专用,用于接受数据,返回数据远端的IP地址和端口
closc():关闭socket
关于“python如何实现socket简单通信”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341