#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/6/2 18:29
# @Author : chen
# @File : 客戶端.py
import json
import socket
import struct
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 9901)) # 客戶端這裏是用connect。服務端是用bind
while True:
# 1、發命令
cmd = input('>>: ').strip() # ls /etc
if not cmd: continue
phone.send(cmd.encode('utf-8')) # send屬於應用層,將數據拷貝給操作系統send操作就結束了
# send 操作是將應用程序的數據從內存拷貝到系統
# 然後由系統傳給網卡
# 所以send操作比recv耗時短
# 2、拿命令的結果,並打印
# 第一步:先接收報頭的長度
obj = phone.recv(4) # 1024是一個坑 recv也是調用網卡設備
header_size = struct.unpack('i', obj)[0]
# 第二步:再接收報頭
header_bytes = phone.recv(header_size)
# 第三步:從報頭中解析出對真實數據的描述信息
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
print(header_dic)
total_size = header_dic['total_size']
# 第四補:接收真實數據
recv_size = 0
recv_data = b''
while recv_size < total_size:
res = phone.recv(1024)
recv_data += res
recv_size += len(res)
print(recv_data.decode('gbk'))
phone.close()
模擬ssh遠程socket編程粘包問題_客戶端
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.