十六.Python网络编程

Python网络编程

#网络编程

# osi七层协议
#物理层  电缆 光纤 双绞线
#链路层   以太网协议
#网络层   ICMP IGMP IP(IPV4 IPV6) ARP RARP协议
#传输层   TCP  UDP协议
#会话层    Session
#表示层
#应用层     应用程序层面

#套接字
#1.基于文件的套接字   AF_UNIX
#2.基于网络的套接字   AF_INET

#TCP协议
#三次握手  四次挥手
#SYN  用与客户端与服务端的连接
#ACK  用于客户端与服务器端的信息确认
#FIN  用于客户端与服务器端的断开连接

#三次握手  用于服务器与客户端的连接
#第一次握手  客户端向服务器发出连接请求   >>     C->> SYN x>>S
#第二次握手  服务器端确认要与客户端建立连接,并且请求与客户端连接  S>> SYN y  ACK=+1  >>C    #客户端向服务器端的连接建立成功
#第三次握手  客户端确认与服务器端建立连接               C>> ACK=+1  >>S                      #服务器向客户端的连接建立成功
# 连接建立成功

#TCP协议为什么能够保证数据传输的完整性

#TCP协议在传输文件后等待另一端的确认信息,如果没有收到确认接收的信息,会重新发送,直到收到确认已接收的信息为止
#所以传输的数据是完整的。

#客户端发送数据,服务器端接收到数据,发出ACK确认信息,对客户端说我收到信息了,你继续向我发送数据吧


#四次挥手  服务器与客户端双方连接通道关闭
#第一次挥手 服务器端数据接收完毕后就会发出Fin请求关闭已建立的连接   S>>Fin y >> C
#第二次挥手 客户端发出确认信息确认关闭服务器到客户端建立的连接  C>>ACK>> S              服务器与客户端的连接关闭
#第三次挥手 客户端数据接收完毕后就会发出Fin请求关闭已建立的连接   C>>Fin x >>S
#第四次挥手 服务器发出确认信息确认关闭服务器到客户端建立的连接  S>>ACK>> C               客户端与服务器端的连接关闭


#Socket编程
#Socket Socket是TCP和UDP协议封装的接口,通过调用Socket可以完成TCP和UDP的功能

#服务器端工作流程
#创建socket服务器    server=socket.socket(套接字协议,TCP|UDP协议)   //socket.AF_INET,socket.SOCKET_STREAM(TCP协议)
#绑定ip和端口地址    server.bind((ip,port))
#建立监听该端口的线程数量  server.listen(5)
#等待客户端的请求       conn,addr=server.accept()#获取连接与地址
#发送信息               conn.send(byte)
#接收信息               info=conn.recv(1024) 接收的数据大小
#关闭连接               conn.close()

#客户端工作流程
#创建客户端                  client=socket.socket(socket.AF_INET,socket.SOCKET_STREAM)
#通过ip和端口号连接服务器    client.conn((ip,port))
#发送信息                   client.send(byte)
# 接收信息                  info=socket.recv(1024)
#关闭连接                   socket.close()

#TCP服务器端

#导入socket模块
import socket

#创建服务器端server
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#server.bind() 服务器绑定要监听的ip和端口号
server.bind(("127.0.0.1",8005))
#建立监听的进程数量
server.listen(6)
#开始等待客户端的连接,如果有连接获取与客户端的连接与地址
conn,addr=server.accept()
#接收客户端发来的信息
info=conn.recv(1024)
#输出客户端发来的信息
print("客户端发来信息:>>%s"%info.decode("utf-8"))
#向客户端发送信息,信息必须是二进制数据
conn.send("hello".encode(encoding="utf-8"))
#服务器端发出请求给客户端要关闭服务器向客户端的连接
conn.close()
print("服务器端关闭连接!")
#关闭服务器端
server.close()

#TCP客户端

#导入socket模块
import socket

#创建客户端client
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#client.connect((ip,port)) 客户端与服务器端建立连接
client.connect(("127.0.0.1",8005))
#client.send() 客户端向服务器端发送信息
client.send("你好".encode("utf-8"))
#client.recv() 客户端接收服务器端发来的信息
info=client.recv(1024)
#输出服务器端发来的内容
print("服务器端发来信息:>>%s"%info.decode("utf-8"))
#客户端请求关闭客户端向服务器端建立的连接
client.close()
print("客户端关闭连接!")
#关闭服务器端
client.close()

#UDP协议

#服务器端

#UDP
#UDP是服务器与客户端的一种网络协议,相对于TCP协议更加高效
#UDP协议接收数据不存在粘包问题,因为UDP协议不存在优化算法,所以不存在粘包问题
#但是UDP协议是一种不可靠的传输,因为UDP没有三次握手,所以UDP发送的数据不能保证UDP服务器或者客户端能够接收

#服务器
#server=socket(AF_INET,SOCK_DGRAM)  #创建udp服务器
#server.bind()                      #绑定ip与端口
#data,addr=server.recvfrom()        #接收数据与地址
#data.sendto(data,addr)             #发送数据到客户端

#客户端
#client=socket(AF_INET,SOCK_DGRAM)  #创建UDP客户端
#client.sendto(data,addr)           #发送数据
#client.recvfrom()                  #接收服务器的数据

#从socket导入所有函数
from socket import *
#导入时间模块
import time

#设置服务器监听的ip与端口号
ip_port=("127.0.0.1",8005)
#设置接收数据的缓冲大小
buffer_size=1024

#创建udp服务器
udp_server=socket(AF_INET,SOCK_DGRAM)
#bind() udp服务器绑定ip与端口
udp_server.bind(ip_port)

#循环接收发送数据报
while True:
    #获取客户端发送的数据,包含内容与客户端地址
    data,addr=udp_server.recvfrom(buffer_size)
    #打印客户端发来的内容
    print("客户端%s发来信息>>:%s"%(addr,str(data)))
    #sendto(data,addr)服务器向客户端回应数据
    udp_server.sendto(time.strftime(data.decode("utf-8"),time.localtime()).encode("utf-8"),addr)

 #UDP 客户端

#导入socket的所有函数
from socket import *

#设置服务器的ip和端口
ip_port=("127.0.0.1",8005)
#设置缓冲区的大小
buffer_size=1024
#获取udp客户端
udp_client=socket(AF_INET,SOCK_DGRAM)

#循环发送,接收数据报
while True:
    #接收控制台输入
    msg=input(">>")
    #sendto(data,addr) 向服务器发送数据
    udp_client.sendto(msg.encode("utf-8"),ip_port)
    #recvfrom()从服务器接收数据
    data=udp_client.recvfrom(buffer_size)
    #打印从服务器获取的时间数据
    print("当前时间为:>>%s"%data.decode("utf-8"))

#TCP协议模拟系统命令行

#server

#导入socket模块所有函数
from socket import  *
import subprocess
#设置服务器监听的ip和端口
ip_port=("127.0.0.1",8005)
#设置半连接池的容量
back_log=5
#设置缓冲区的大小
buffer_size=1024
#创建服务器
server=socket(AF_INET,SOCK_STREAM)
#服务器绑定ip与端口号
server.bind(ip_port)
#监听该端口号
server.listen(back_log)
#循环监听端口号,为不同的客户端服务
while True:
    try:
        #获取客户端的连接与客户端的地址
        print("服务器等待连接...")
        conn,addr=server.accept()
        #循环收发客户端的信息
        while True:
            try:
                #接收客户端发来的内容
                data=conn.recv(buffer_size).decode("utf-8")
                #如果内容为空,继续下次循环
                if not data:break
                #输出客户端发来的内容
                print("客户端发来信息:>>%s"%data)
                res=subprocess.Popen(data,shell=True,stderr=subprocess.PIPE,
                                 stdout=subprocess.PIPE,
                                 stdin=subprocess.PIPE)
                con=res.stderr.read().decode("gbk")
                if not con:
                    con=res.stdout.read().decode("gbk")
                if not con:
                    con=">>执行成功!"
                #向客户端发送信息
                conn.send(con.upper().encode("utf-8"))
            except Exception as e:
                #遇到错误,打印错误,避免程序崩溃,退出此次循环
                print(e)
                break
        conn.close()
    except Exception as e:
        #客户端异常终止,打印错误,继续下次循环,监听端口,等待下一个客户端的介入
        print(e)
        continue

#client

#导入socket的函数
from socket import *
from functools import partial

def a(client,buffer_size):
    return client.recv(buffer_size)


#设置服务器的ip和端口
ip_port=("127.0.0.1",8005)
#设置缓冲区
buffer_size=1024
#获取TCP客户端
client=socket(AF_INET,SOCK_STREAM)
#连接TCP服务器
client.connect(ip_port)
#循环收发信息
while True:
    try:
        #输入发送信息
        msg=input(">>")
        #输入quit退出程序
        if msg=="quit":
            break
        #向服务器发送信息
        client.send(msg.encode("utf-8"))
        #接收TCP服务器发来的内容
        while True:
            data=client.recv(buffer_size)
            # 输出服务器发来的信息
            print("服务器发来信息:>>%s" % data.decode("utf-8"))
            #如果此次接收的数据大小小于buffersize,就相当于此次是最后的数据
            if len(data)<buffer_size:break
        #遇到错误终止
    except Exception as e:
        print(e)
        break





猜你喜欢

转载自blog.csdn.net/qq_39663113/article/details/85472407