网络编程

Posted lingcai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程相关的知识,希望对你有一定的参考价值。

网络协议:

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。

  使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。

         使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

三次握手(一定是client先发起请求):

  • a 客户端发起请求连接服务器
  • b 服务器返回 : 接收到请求,并要求连接客户端
  • c 客户端回复 : 可以连接

四次挥手(谁先发起断开连接的请求都可以):

  • a 客户端发起断开连接的请求:意思是: 我想和你断开连接,我没有数据要继续发送了,但是如果你有数据需要发送,我可以继续接收
  • b 服务器回复 : 我接收到你的请求了
  • c 服务器发送 : 我已经准备好断开连接了
  • d 客户端回复 : 收到你的信息,断开连接
 

架构:

1 cs(client / server)架构:客户端与用户端架构.    客户端泛指用户端的EXE,需要用户实现安装相应的客户端(app之类).对电脑操作系统依赖较大   优势:发挥pc端的性能

技术分享图片

2 bs(Browser与Server),中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。统一了用户接口

  Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser               浏览器就能进行增删改查。

示例小程序:

技术分享图片
import socket  # 引入socket模块
slicent = socket.socket()  # 创建套连接
slicent.bind((192.168.13.58, 8000))  # 创建端口
slicent.listen(5)  # 最大排队数5
conn, addr = slicent.accept()  # 等待客户端连接  会有阻塞
data = conn.recv(1024)   #接收客户端发送来的消息
print(data.decode("utf8"))#解码打印
conn.send(b"ok")  #给客户端回复
slicent.close()
服务端
技术分享图片
import socket
server = socket.socket()  # 创建套接字
server.connect(("192.168.13.58", 8000))  # 连接服务端
neirong = input("请输入你想说的话:")
server.send(neirong.encode("utf8"))  #发送给服务端内容
data = server.recv(1024)  #接收服务端发送来的消息
print(data.decode())  #打印消息
server.close() #关闭套连接
客户端

 

struct模块:

import struct

res = struct.pack("i", 123456)  #"i"表示int,后面输入内容只能是int类型  编码压包

print(res)  #b‘@xe2x01x00‘
print(len(res))# 4   内容长度压缩到4个字节


obj = struct.unpack("i", res)  #解码解包
print(obj)   # (123456,) 返回的是元组
print(obj[0])  #123456  取到压缩的内容

 

subprocess模块:python中可以执行终端的命令

import subprocess

res=subprocess.Popen("dir",
                     shell=True,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)  


print(res.stdout.read().decode("gbk"))

 

 

模拟ssh:

技术分享图片
import socket,subprocess  # 引入socket模块
slicent = socket.socket()  # 创建套连接
slicent.bind((192.168.13.58, 8000))  # 创建端口
slicent.listen(5)  # 最大排队数5

while 1: #循环建立连接
    print("server is waiting....")
    conn, addr = slicent.accept()  # 等待客户端连接  会有阻塞

    while 1:  #循环接受信息
        try:
            cmd= conn.recv(1024).decode("utf8")  #接收客户端发送来的消息
            if cmd == exit:  #如果收到的信息是exit 退出本层循环
                break
            res=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)

            err=res.stderr.read() #根据给的指令在终端执行 反馈的结果有错误
            out=res.stdout.read()#根据给的指令在终端执行 反馈的结果(正常)
            print("err相应内容",err.decode("gbk"))
            print("out相应内容",out.decode("gbk"))
            if err:#如果有错误
                import struct
                header_pack=struct.pack("i",len(err))  #压缩打包err的长度
                conn.send(header_pack)  #给客户端回复错误字节长度
                conn.send(err)

            else:#如果指令没有错误
                import struct
                header_pack=struct.pack("i",len(out)) ##构建报头
                conn.send(header_pack)  #发送报头
                conn.send(out)   #发送数据  因为数据为底层的gbk编码 所以不用再次编码

        except Exception as e: #异常退出
            break
    conn.close()#关闭本次套接字
服务端
技术分享图片
import socket,struct
server = socket.socket()  # 创建套接字
server.connect(("192.168.13.58", 8000))  # 连接服务端
while 1:  #循环输入
    cmd = input("请输入命令:")  #给服务端发送想要其执行的指令 例如:dir  ipconfig  ipconfig /all
    if not cmd:continue
    elif cmd ==exit:
        break
    server.send(cmd.encode("utf8"))  #发送给服务端要执行的命令
    data_l = server.recv(4)  #接收服务端发送来的消息的长度
    data_length=struct.unpack("i",data_l)[0]#解包长度

    recv_data_length=0  #设定传过来的内容长度
    recv_data=b""       #设定传过来的内容
    while recv_data_length<data_length: #当前传过来的内容长度小于传过来的内容的总长度
        data=server.recv(1024)  #每次接收1024个字节
        recv_data_length+=len(data)  #传过来内容长度
        recv_data+=data#传过来的内容
    print(data.decode(gbk))  #打印消息
server.close() #关闭套连接
客户端

黏包:

简单来说就是连续发送的文件可能被打包成一个传到另一服务器端,引入了sticut模块来解决这个问题

 

文件上传:

 

以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC

如何在 Django Summernote 中显示编程片段的代码块?