首页 > 其他 > 详细

网络编程

时间:2020-12-04 09:10:32      阅读:26      评论:0      收藏:0      [点我收藏+]
网络编程 
什么socket?

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。
使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大
努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
   
软件
客户端:CS架构, client -> server
浏览器:BS架构, browser -> server

为什么要网络通信发送的是字节?而不是字符串?
py3, send/recv 都是字节
py2, send/recv 都是字符串


服务端:
accept,阻塞:等待客户端来连接。
recv, 阻塞:等待客户端发来数据。

客户端:
connect,阻塞:一直在连接,直到连接成功才往下运行其他代码。
recv, 阻塞:等待服务端发来数据。

服务端:
 1 import socket
 2 
 3 server = socket.socket()
 4 
 5 server.bind((127.0.0.1,8001))
 6 
 7 server.listen(5)
 8 
 9 while True:
10     conn,addr = server.accept()
11     # 字节类型
12     try:
13         while True:
14             data = conn.recv(1024) # 阻塞
15             if data == bexit:
16                 break
17             response = data + b SB
18             conn.send(response)
19     except ConnectionResetError:#防止客户端终端后 服务端异常  window环境下使用
20         break
21 
22     conn.close()

客户端:

 1 import socket
 2 
 3 sk = socket.socket()
 4 
 5 sk.connect((127.0.0.1,8001))
 6 
 7 while True:
 8     name = input("请输入姓名:")
 9     sk.send(name.encode(utf-8)) # 字节
10 
11     if name == exit:
12         break
13 
14     response = sk.recv(1024) # 字节
15     print(response.decode(utf-8))
16 
17 sk.close()

 

 

socket粘包

socket的粘包为在数据量小与时间间隔短的情况下 优化算法使数据减少IO以达到提高效率,减少网络IO的一种方式

socket下的send与recv并不是一对一的  可以一对多 多对一即可  

粘包主要是接收端不知所接收的大小(即不知数据的开头与结尾)  只要明确数据的大小 即可解决粘包导致的缺点 

一般可以使用struck来达到效果

 

send  : 只需要copy data     send不是直接操作网卡的   本质上是数据由用户程序copy到操作系统缓存    操作系统来调用网卡传输     

recv: 1. wait data   2. copy data  时间较长   

 

struct用法

技术分享图片
 1 import struct
 2 res=struct.pack("i","")
 3 print(res)
 4 print(len(res))
 5 obj=struct.unpack("i",res)
 6 print(obj[0])import struct
 7 res=struct.pack("i","")
 8 print(res)
 9 print(len(res))
10 obj=struct.unpack("i",res)
11 print(obj[0])
struct

subprocess用法

技术分享图片
import subprocess

res=subprocess.Popen("dir",
                     shell=True,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)
print(res.stdout.read().decode("gbk"))
subprocess

 

SSH Server

 1 import socket
 2 import subprocess
 3 
 4 server = socket.socket()
 5 
 6 server.bind((127.0.0.1,8008))
 7 
 8 server.listen(5)
 9 
10 while True:
11     print("server is working.....")
12     conn,addr = server.accept()
13     # 字节类型
14     while True:
15         # 针对window系统
16         try:
17             cmd = conn.recv(1024).decode("utf8") # 阻塞
18 
19             if cmd == bexit:
20                 break
21 
22             res=subprocess.Popen(cmd,
23                              shell=True,
24                              stderr=subprocess.PIPE,
25                              stdout=subprocess.PIPE,
26                              )
27             # print("stdout",res.stdout.read())
28             # print("stderr",res.stderr.read().decode("gbk"))
29             out=res.stdout.read()
30             err=res.stderr.read()
31 
32             print("out响应长度",len(out))
33             print("err响应长度",len(err))
34             if err:
35                  import struct
36                  header_pack = struct.pack("i", len(err))
37                  conn.send(header_pack)
38                  conn.send(err)
39             else:
40                  #构建报头
41                  import struct
42                  header_pack=struct.pack("i",len(out))
43                  print("header_pack",header_pack)
44                  # # 发送报头
45                  conn.send(str(len(out)).encode("utf8"))
46                  # 发送数据
47                  conn.send(out)
48 
49 
50 
51 
52         except Exception as e:
53             break
54 
55 
56     conn.close()

SSH Client

 1 import socket
 2 import struct
 3 sk = socket.socket()
 4 
 5 sk.connect((127.0.0.1,8008))
 6 
 7 while 1:
 8     cmd = input("请输入命令:")
 9     sk.send(cmd.encode(utf-8)) # 字节
10     if cmd=="":
11         continue
12     if cmd == exit:
13         break
14 
15     # header_pack=sk.recv(4)
16     # data_length=struct.unpack("i",header_pack)[0]
17     # print("data_length",data_length)
18     ‘‘‘
19     b‘xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb‘
20     
21     
22     ‘‘‘
23     data_length=int(sk.recv(1024).decode("utf8"))
24     print("data_length",data_length)
25 
26     recv_data_length=0
27     recv_data=b""
28 
29     while recv_data_length<data_length:
30         data=sk.recv(1024)
31         recv_data_length+=len(data)
32         recv_data+=data
33 
34     print(recv_data.decode("gbk"))
35 
36 
37 sk.close()

 

网络编程

原文:https://www.cnblogs.com/kxuan/p/14083912.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!