import socket,os
server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
conn,addr=server.accept()
print("new conn:",addr)
while True:
data=conn.recv(1024)
if not data:
print("客户端已断,请重新输入")
break
cmd_res=os.popen(data.decode('utf-8')).read()
if len(cmd_res)==0:
cmd_res='无效命令,没有返回值'
conn.send(cmd_res.encode('utf-8')) server.close()
import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:
continue
client.send(cmd.encode('utf-8'))
cmd_res=client.recv(1024)
print(cmd_res.decode('utf-8'))
client.close()

服务器端的输出

new conn: ('127.0.0.1', 61966)
'pwd' is not recognized as an internal or external command,
operable program or batch file.

客户端的输出

>>:pwd
无效命令,没有返回值
>>:dir
Volume in drive C is OSDisk
Volume Serial Number is 002E-D604 Directory of C:\abccdxddd\Oldboy\Py_Exercise\Day8 08/07/2017 03:54 PM <DIR> .
08/07/2017 03:54 PM <DIR> ..
08/07/2017 03:52 PM 280 client_ch.py
08/07/2017 03:54 PM 509 server_ch.py
08/03/2017 11:17 AM 650 socket_ssh_server.py
08/03/2017 11:26 AM 259 sock_ssh_client.py
08/03/2017 03:56 PM 133 ssh_client.py
08/03/2017 03:54 PM 415 ssh_server.py
08/03/2017 04:55 PM 259 ????.py
08/07/2017 10:27 AM 146 ????.py
8 File(s) 2,651 bytes
2 Dir(s) 145,735,159,808 bytes free

让超过1024大小的数据的一次返回,先在服务器端计算大小,把需要接受的次数传给客户端。

服务器端:

import socket,os

server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
conn,addr=server.accept()
print("new connection is :",addr)
while True:
data=conn.recv(1024)
if not data:
print("客户端已经断开")
break
cmd_res=os.popen(data.decode('utf-8')).read()
if len(cmd_res)==0:
cmd_res="命令无效,没有返回值"
conn.send(str(len(cmd_res)).encode('utf-8'))
#整数不能直接encode,需要先转成字符串,再encode.发大小给客户端
conn.send(cmd_res.encode('utf-8'))
server.close()

客户端:

import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:
break
client.send(cmd.encode('utf-8'))
cmd_res_size=client.recv(1024) #接收命令结果的长度。
print("命令结果大小:",cmd_res_size)
received_size=0
received_data=b""
while received_size<int(cmd_res_size.decode("utf-8")):
data=client.recv(1024)
received_size=received_size+len(data) #每次收到的有效数字,有可能小于1024
received_data=received_data+data
else:
print("cmd res received done...",received_size)
print(received_data.decode('utf-8'))
client.close()

实现收到的数据大小跟要传输的数据大小相一致。

import socket,os

server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
conn,addr=server.accept()
print("new connection is :",addr)
while True:
data=conn.recv(1024)
if not data:
print("客户端已经断开")
break
cmd_res=os.popen(data.decode('utf-8')).read()
if len(cmd_res)==0:
cmd_res="命令无效,没有返回值"
conn.send(str(len(cmd_res.encode())).encode('utf-8'))
#整数不能直接encode,需要先转成字符串,再encode.发大小给客户端
conn.send(cmd_res.encode('utf-8'))
server.close()

客户端:

import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:
break
client.send(cmd.encode('utf-8'))
cmd_res_size=client.recv(1024) #接收命令结果的长度。
print("命令结果大小:",cmd_res_size)
received_size=0
received_data=b""
while received_size<int(cmd_res_size.decode("utf-8")):
data=client.recv(1024)
received_size=received_size+len(data) #每次收到的有效数字,有可能小于1024
received_data=received_data+data
else:
print("cmd res received done...",received_size)
print(received_data.decode('utf-8'))
client.close()

关于字符长度:

aa="人"
print(len(aa))
print(len(aa.encode('utf-8')))

结果输出:

1
3

最新文章

  1. jstack+top定位性能问题
  2. MySql基本概念(一)
  3. python基础随笔
  4. artEditor增加h5拍照上传图片
  5. C++ 中 volatile 的使用
  6. iOS-xib(使用XIB实现嵌套自定义视图)
  7. Qualcomm 8X camera daemon进程浅析
  8. ERROR: The node /hbase is not in ZooKeeper. It should have been written by the master. Check the value configured in &#39;zookeeper.znode.parent&#39;. There could be a mismatch with the one configured in the
  9. linux if 判断字符串是否相等
  10. UVA - 10131Is Bigger Smarter?(DAG上的DP)
  11. Android启动篇 — init原理(二)
  12. (五十九)iOS网络基础之UIWebView简易浏览器实现
  13. CentOS7下解决yum install mysql-server 异常:No package mysql-server available.问题
  14. 27. Spring Boot 缓存注解详解: @Cacheable、@CachePut、 @CacheEvict、@Caching、@CacheConfig
  15. Confluence 6 H2 数据库连接与合并整合
  16. 添加删除tag
  17. [Leetcode 55]跳格子JumpGame
  18. python2和Python3异同总结
  19. 18-javaweb-ssm 开发中错误总结
  20. kubernetes实战(十):k8s使用Helm安装harbor

热门文章

  1. 北京Uber优步司机奖励政策(2月19日)
  2. 笔记本ubuntu安装wifi驱动(未完成)
  3. Wireshark对HTTPS数据的解密
  4. react组件性能
  5. 浅析Win8/8.1下安装SQL Server 2005 出现服务项无法正常启动解决方案
  6. 「题目代码」P1060~P1065(Java)
  7. Jmeter登录接口返回 status415
  8. Linux管道及I/O重定向
  9. Siki_Unity_1-4_C#编程(零基础)
  10. 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别