python之网络编程

2021-07-08 02:04

阅读:789

标签:介绍   str   字节   服务端   执行   col   超过   output   import   

一、什么是网络编程

  网络编程简单来说就是对信息的发送到接收,中间传输为物理线路的作用。

  在我们没有学过网络编程之前,在应用上写的代码都是只能自己提供自己使用,不能与其他人交互。那么如何实现相互通信呢?

二、数据之间的相互通信

 1 服务端
 2 import socket   #导入socket套接字模块
 3 server = socket.socket()    #创建一个socket对象
 4 server.bind(("192.168.13.132",8000))    #绑定IP与端口
 5 server.listen(3)    #规定只允许不超过三人链接服务端
 6 conn,addr = server.accept()     #创建媒介与客户端地址
 7 data = conn.recv(1024)      #新建一个变量,通过媒介接收客户端传输过来的字节并限制不超过1024
 8 print(data)         #打印客户端传来的讯息
 9 conn.send(b"123456")        #返回给客户端的字节
10 conn.close()        #与服务器断开链接
11 server.close()      # 关闭服务器的服务
1 # 客户端
2 import socket       #导入socket模块
3 client = socket.socket()      #创建一个socket对象
4 client.connect(("192.168.13.132",8000))     #与服务端建立链接
5 client.send(b"456789")      #向服务断传输讯息(字节型)
6 data =client.recv(1024)     #接服务端传来的讯息 不超过1024字节
7 print(data)         # 打印
8 client.close()      #关闭客户端

 三、网络编程的简单应用

  模拟ssh

    在没有介绍代码之前需要引入subprocess模块,subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码

  我们需要学会一下代码就足够了

1 import subprocess
2 res = subprocess.Popen("ipconfig",
3                        shell= True,
4                        stderr=subprocess.PIPE,
5                        stdout=subprocess.PIPE
6 
7                       )
8 print(res.stdout.read().decode("gbk"))

  建立服务端

 1 # 服务端
 2 import socket
 3 import subprocess
 4 server = socket.socket()
 5 server.bind(("192.168.13.132",8000))
 6 server.listen(3)
 7 print("建立链接中。。。")
 8 conn,addr = server.accept()
 9 print("等待响应中。。。")
10 while True:
11     cmd = conn.recv(1024).decode("utf-8")
12     res = subprocess.Popen(cmd,
13                                shell= True,
14                                stderr=subprocess.PIPE,
15                                stdout=subprocess.PIPE
16                               )
17     result = res.stdout.read()
18     print("响应长度为%s" % len(result))
19     conn.send(result.decode("gbk").encode("utf-8"))

  建立客户端

# 客户端
import socket
client =socket.socket()
client.connect(("192.168.13.132",8000))
while True:
    user_input = input("请输入dose命令")
    client.send(user_input.encode("utf-8"))
    result = client.recv(1024).decode("utf-8")
    print(result)

四、黏包现象

  黏包现象就是同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就称之为黏包。

  只有tcp协议会出现黏包现象,dcp协议不会出现。

  

  技术分享图片

 

   解决黏包的理想方案:

  

 1 # 服务端
 2 import socket    #套接字模块
 3 import subprocess
 4 import struct
 5 server = socket.socket()
 6 server.bind(("192.168.13.132",8000))
 7 server.listen(3)
 8 print("建立链接中。。。")
 9 conn,addr = server.accept()
10 print("等待响应中。。。")
11 while True:
12     cmd = conn.recv(1024).decode("utf-8")
13     res = subprocess.Popen(cmd,
14                                shell= True,
15                                stderr=subprocess.PIPE,
16                                stdout=subprocess.PIPE
17                               )
18     result = res.stdout.read()
19     error = res.stderr.read()
20     print("响应长度为%s" % len(result))
21     print("错误信息为%s" % error.decode("gbk"))
22     if error:
23         back_message = error
24     else:
25         back_message = result
26     conn.send(struct.pack("i", len(back_message)))  # 构建报头
27     conn.send(back_message)  # 发送数据
 1 # 客户端
 2 import socket
 3 import struct
 4 client =socket.socket()
 5 client.connect(("192.168.13.132",8000))
 6 while True:
 7     user_input = input("请输入dose命令")
 8     client.send(user_input.encode("utf-8"))
 9     maxbytes = client.recv(4)
10     long = struct.unpack("i",maxbytes)[0]
11     num = 0
12     data = b""
13     while num  long:
14         receive = client.recv(1024)
15         data +=receive
16         num +=len(receive)
17     print(data.decode("gbk"))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

python之网络编程

标签:介绍   str   字节   服务端   执行   col   超过   output   import   

原文地址:https://www.cnblogs.com/qq631243523/p/9578903.html


评论


亲,登录后才可以留言!