标签:介绍 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"))
标签:介绍 str 字节 服务端 执行 col 超过 output import
原文地址:https://www.cnblogs.com/qq631243523/p/9578903.html