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 通信流程

介绍相关方法和参数
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,因此输出需要解码为gbkbytes编码 与 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,陈先生 