当前位置: 首页 > 图灵资讯 > 行业资讯> Python之简单的网络编程

Python之简单的网络编程

发布时间:2025-10-12 17:49:33

OSI 模型介绍

应用层 -- 解释、加密和解密接收的数据,压缩和解压缩。

会话层 -- 通过传输层(端口号: 传输端口和接受端口) 建立数据传输通道。

传输层 -- 定义了一些传输数据的协议和端口号(www端口80等)。),如:TCP。

网络层 -- IP地址主要是从下层接收到的数据(例如:192.168.0.1)包装和解封装。

数据链路层 -- MAC地址的封装和解封装主要是从物理层接收到的数据。

物理层 -- 物理设备标志的主要定义,如过去的接口类型、跟踪传输介质的传输速率等。

TCP/IP协议

参考模型将所有TCP/IP系列协议分为四个抽象层。

应用层 -- TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

传输层 -- TCP,UDP

网络层 -- IP,ICMP,OSPF,EIGRP,IGMP

数据链路层 -- SLIP,CSLIP,PPP,MTU

Socket 通信流程

zz.png

介绍相关方法和参数

family=AF_INET:服务器之间的通信
family=AF_UNIX:Unix在不同的进程间通信
sk.bind(address)
#s.bind(address)将套接字绑定到地址。Address地址的格式取决于地址族。在AF_INET下,以元组(host,port)表示地址的形式。
sk.listen(backlog)
#开始监控传入连接。backlog指定了在拒绝连接之前可以挂起的连接数量。
#backlog等于5,表示内核已接到连接请求,但服务器尚未调用accept处理的连接数为5
#这个值不能大,因为连接队列应该在核心中维护
sk.setblocking(bool)
#是否堵塞(默认True),如果设置False,一旦accept和recv没有数据,就会报错。
sk.accept()
#接受连接并返回(conn,address),其中,conn是一个新的套接字对象,可用于接收和发送数据。address是连接客户端的地址。
#接收TCP客户的连接(阻塞式)等待连接的到来
sk.connect(address)
#连接到address的套接字。通常,address的格式是元组(hostname,port),如果连接错误,返回socket.error错误。
sk.connect_ex(address)
#同上,只有返回值,连接成功时返回0,连接失败时返回编码,如10061
sk.close()
#关闭套接字
sk.recv(bufsize[,flag])
#接收套接字数据。数据以字符串的形式返回,bufsize指定最多可接收的数量。通常可以忽略flag提供的其他信息。
sk.send(string[,flag])
#将string中的数据发送到连接的套接字。返回值是要发送的字节数,可能小于string的字节大小。也就是说,指定内容可能不会全部发送。
sk.sendall(string[,flag])
#将string中的数据发送到连接的套接字,但在返回之前尝试发送所有数据。成功返回None,失败抛出异常。
#所有内容都是通过递归调用send发送的。

简单的通信(client 端发消息,server 端接收,一发一收)

相关推荐:Python视频教程

#server端
importsocket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)
print('waiting...')
conn,addr=sk.accept()
while1:
data=conn.recv(1024)#server端通过conn接收和发送数据
print('...',str(data,'utf8'))
ifnotdata:break
inp=input('>>>')
conn.send(bytes(inp,'utf8'))
sk.close()
#client端
importsocket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
whileTrue:
inp=input('>>>')
ifinp=='exit':
break
sk.send(bytes(inp,'utf8'))#client端通过sk接收和发送数据
data=sk.recv(1024)
print(str(data,'utf8'))
sk.close()

简单的通信(server 持续监听)

#server端
importsocket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)
print('waiting...')
while1:
conn,addr=sk.accept()
print(addr)
while1:
try:
data=conn.recv(1024)
exceptException:
break
print('...',str(data,'utf8'))
inp=input('>>>')
conn.send(bytes(inp,'utf8'))
sk.close()
#client端
importsocket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
whileTrue:
inp=input('>>>')
ifinp=='exit':
break
sk.send(bytes(inp,'utf8'))
data=sk.recv(1024)
print(str(data,'utf8'))
sk.close()

使用python执行命令

importsubprocess
a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
print(str(a.stdout.read(),'gbk'))#windows机默认编码为gbk,因此输出需要解码为gbk

bytes编码 与 str编码相互转换

str:unicode
bytes:十六进制
s='hello,陈先生'
print(type(s))#<class'str'>

b=bytes(s,'utf8')#将str编码成bytess
print(type(b))#<class'bytes'>
print(b)#b'hello,xe9\x98\xe5\x88f
b2=s.encode('utf8')#将str编码成bytess
print(type(b2))#<class'bytes'>
print(b)#b'hello,xe9\x98\xe5\x88f
s1=str(b2,'utf8')#bytes解码成strrrtes
print(s1)#hello,陈先生
s2=b2.decode('utf8')#bytes解码strr
print(s2)#hello,陈先生

相关文章

Python之简单的网络编程

Python之简单的网络编程

2025-10-12
python集合是否可变总结

python集合是否可变总结

2025-10-10
一文读懂Python中的映射

一文读懂Python中的映射

2025-10-10
python中的josn方法相关介绍

python中的josn方法相关介绍

2025-10-10
Python中的递归函数是什么

Python中的递归函数是什么

2025-10-10
Python可变参数函数用法详解

Python可变参数函数用法详解

2025-10-10