十六.Python网络编程
发布日期:2021-05-07 00:20:24 浏览次数:19 分类:技术文章

本文共 5860 字,大约阅读时间需要 19 分钟。

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#创建服务器端serverserver=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#创建客户端clientclient=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 partialdef 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)

 

上一篇:JAVA多线程__Socket
下一篇:十五.Python异常处理

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月03日 22时49分58秒