网络也是IO的一种。在Python中,有一个特殊的套接字模块来处理网络操作。
Socket,又叫“socket”,用来描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发送请求或回答网络请求。
Socket起源于Unix,而Unix/Linux的一个基本哲学就是“一切都是文件”,文件以[打开]、[读/写]和[关闭]的模式运行。套接字就是这种模式的一种实现。socket是一个特殊的文件,一些socket函数对其进行操作(读/写IO,打开和关闭)。
(1)简单链接使用套接字
Python中的套接字支持UDP、TCP和进程间通信。socket可以封装我们想要发送的东西,把它发送过去,然后把它反转到原来的样子。其实网络通信可以理解成成都是建立在socket之上的。下面的代码是为了演示使用socket的简单链接。
#要进行通信,必须至少有两个人,即服务器和客户端
#服务器端
' '必须先打开,等待客户端做出链接请求,所以你首先要有一个地址,也就是IP,还要有自己的端口,没有这个端口你是进不去的。'''
导入套接字
Sk= socket.socket()#创建对象
sk . bind(' 127 . 0 . 0 . 1 ',9999,)#绑定IP和端口,并将其作为元组传入
Sk .听(5)#当前面的链接已经建立时,让最多五个人在后面等待。
当为真时:#将服务器置于总是可以接受客户端请求的状态
conn,address=sk.accept()
打印(连接器,地址)
'''
监听端口、等待和接受客户端的请求可能会被阻止。主要功能是建立链接并接受客户信息
Conn相当于双方建立的这个环节,然后相互沟通就靠这个环节;
地址指的是对方的IP和端口
'''
以下是客户端代码
#客户端
导入套接字
obj =socket.socket()
与客户端相比,决定链接到谁很好
'''
Obj.connect (('127.0.0.1 ',9999,)#链接服务器
obj.close()#链接后关闭
我们先启动服务器,再启动客户端,如图
('127.0.0.1', 36126)
& ltsocket.socket fd=5,family=AddressFamily。AF_INET,type=SocketKind。SOCK_STREAM,proto=0,laddr=('127.0.0.1 ',9999),raddr=('127.0.0.1 ',36128)>('127.0.0.1', 36128)
& ltsocket.socket fd=4,family=AddressFamily。AF_INET,type=SocketKind。SOCK_STREAM,proto=0,laddr=('127.0.0.1 ',9999),raddr=('127.0.0.1 ',36130)>('127.0.0.1', 36130)
成功打印每个链接,以及客户端的IP和端口号
(2)基于套接字的简单消息传输
#服务器端
导入套接字
sk= socket.socket()
sk . bind(' 127 . 0 . 0 . 1 ',9999,)#绑定IP和端口,并将其作为元组传入
Sk .听(5)#当前面的链接已经建立时,让最多五个人在后面等待。
当为真时:#将服务器置于总是可以接受客户端请求的状态
Conn,address=sk.accept()#发送基于conn的东西
conn . sendall(bytes(' has空天天来Linux公社给你新知识',编码= ' utf-8 ')# python 3应该用字节类型发送字节
''一旦建立链接,服务器将发送此字段'''
打印(连接器,地址)
然后使用客户端代码
#客户端
导入套接字
obj =socket.socket()
与客户端相比,决定链接到谁很好
'''
Obj.connect (('127.0.0.1 ',9999,)#链接服务器
'''
客户端链接到服务器。如果服务器不向客户端返回消息,客户端将始终
在recv状态,我一直在等待来自服务器的消息
'''
Result1= obj.recv(2014)#表示接收的最大字节数为1024,超过了下一次接收。
result2= str(result1,编码='utf-8 ')
打印(结果2)
obj.close()#链接后关闭
当您启动客户端一次并建立链接时,您将收到一条消息,如下图所示
'''
客户端链接到服务器。如果服务器不向客户端返回消息,客户端将始终
在recv状态,我一直在等待来自服务器的消息
'''
Result1= obj.recv(2014)#表示接收的最大字节数为1024,超过了下一次接收。
result2= str(result1,编码='utf-8 ')
打印(结果2)
虽然真实:
Data = input('请输入您想要发送的内容:')
if data == 'q ':
obj.sendall(字节(数据,编码='utf-8 '))
打印(“链接断开”)
打破
else:
obj.sendall(字节(数据,编码='utf-8 '))
Rec_byte = obj.recv(1024)#发送后接收信息
rec_str = str(rec_byte,编码='utf-8 ')
打印(rec_str)
obj.close()#链接后关闭
结果如图所示
'''
客户端链接到服务器。如果服务器不向客户端返回消息,客户端将始终
在recv状态,我一直在等待来自服务器的消息
# '''
#obj.sendall(字节(' hello ',编码='utf-8 '))
ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,编码='utf-8 ')
打印(ret_str)
#发送文件大小
size = OS . stat(' linu xdc . png ')。获取文件大小
Obj。sendall(字节(str (size),编码= ' utf-8 '))# int类型的文件大小,必须先转换为字符串
open(' linu xdc . png ',' rb ')为f:
对于f中的行:
obj.sendall(行)
obj.close()
有关Python的更多信息,请参见Python特别页面https://www.linuxidc.com/topicnews.aspx? tid = 17
Linux社区的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-12/156062.htm
1.《socket编程实例 Python网络编程socket模块实例解析》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《socket编程实例 Python网络编程socket模块实例解析》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1038823.html