VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • python基础(30):黏包、socket的其他方法

1. 黏包

1.1 黏包现象

让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)

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

1.1.1 基于TCP协议实现的黏包

server:


  1. #_*_coding:utf-8_*_
  2. from socket import *
  3. import subprocess
  4.  
  5. ip_port=('127.0.0.1',8888)
  6. BUFSIZE=1024
  7.  
  8. tcp_socket_server=socket(AF_INET,SOCK_STREAM)
  9. tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
  10. tcp_socket_server.bind(ip_port)
  11. tcp_socket_server.listen(5)
  12.  
  13. while True:
  14. conn,addr=tcp_socket_server.accept()
  15. print('客户端',addr)
  16.  
  17. while True:
  18. cmd=conn.recv(BUFSIZE)
  19. if len(cmd) == 0:break
  20.  
  21. res=subprocess.Popen(cmd.decode('utf-8'),shell=True,
  22. stdout=subprocess.PIPE,
  23. stdin=subprocess.PIPE,
  24. stderr=subprocess.PIPE)
  25.  
  26. stderr=res.stderr.read()
  27. stdout=res.stdout.read()
  28. conn.send(stderr)
  29. conn.send(stdout)

client:


  1. #_*_coding:utf-8_*_
  2. import socket
  3. BUFSIZE=1024
  4. ip_port=('127.0.0.1',8888)
  5.  
  6. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  7. res=s.connect_ex(ip_port)
  8.  
  9. while True:
  10. msg=input('>>: ').strip()
  11. if len(msg) == 0:continue
  12. if msg == 'quit':break
  13.  
  14. s.send(msg.encode('utf-8'))
  15. act_res=s.recv(BUFSIZE)
  16.  
  17. print(act_res.decode('utf-8'),end='')

1.1.2 基于UDP协议实现的黏包

server:


  1. #_*_coding:utf-8_*_
  2. from socket import *
  3. import subprocess
  4.  
  5. ip_port=('127.0.0.1',9000)
  6. bufsize=1024
  7.  
  8. udp_server=socket(AF_INET,SOCK_DGRAM)
  9. udp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
  10. udp_server.bind(ip_port)
  11.  
  12. while True:
  13. #收消息
  14. cmd,addr=udp_server.recvfrom(bufsize)
  15. print('用户命令----->',cmd)
  16.  
  17. #逻辑处理
  18. res=subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
  19. stderr=res.stderr.read()
  20. stdout=res.stdout.read()
  21.  
  22. #发消息
  23. udp_server.sendto(stderr,addr)
  24. udp_server.sendto(stdout,addr)
  25. udp_server.close()

client:


  1. from socket import *
  2. ip_port=('127.0.0.1',9000)
  3. bufsize=1024
  4.  
  5. udp_client=socket(AF_INET,SOCK_DGRAM)
  6.  
  7.  
  8. while True:
  9. msg=input('

相关教程