博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket浅析(二): 构建通过socket通信的服务端和客户端
阅读量:5162 次
发布时间:2019-06-13

本文共 2646 字,大约阅读时间需要 8 分钟。

socket服务端代码:

 

1 import socket 2 import os,subprocess 3  4  5 server = socket.socket() #获得socket实例 6 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 7  8 ip_port = ('127.0.0.1', 10000) # 要绑定的IP及端口,元组数据形式 9 10 server.bind(ip_port) # 绑定ip port11 server.listen()  # 开始监听12 13 while True: # 第一层loop14 15     print("server is waiting...")16     conn,addr = server.accept() # 接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...17     print("Connected by :",addr ) # 打印出当前是谁链接了客户端18 19     while True:20         data = conn.recv(1024)21         if not data:22             print("客户端断开了...")23             break # 这里断开就会再次回到第一次外层的loop24 25         print("收到要执行的命令:",data)26         #res = os.popen(data.decode()).read() #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下27         res = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE).stdout.read() # 跟上面那条命令的效果是一样的28 29         if len(res) == 0:30             res = "cmd exec success,has not output!".encode("utf-8")31 32         conn.send(str(len(res)).encode("utf-8")) # 发送数据之前,先告诉客户端要发多少数据给它33         client_final_ack = conn.recv(1024) # 等待客户端响应34         if client_final_ack.decode() == int(len(res)): # 如果收到客户端响应的标志位和发送的标志位相等,即代表客户端已经准备好接收数据了35             36             print(type(res))37             conn.sendall(res) #发送端也有最大数据量限制,所以这里用sendall,相当于重复循环调用conn.send,直至数据发送完毕38 39 server.close()

 

 

socket客户端代码:

 

1 import socket 2 import sys 3  4 client = socket.socket() # 实例化socket 5 ip_port = ('127.0.0.1', 10000) # 要绑定的IP及端口,元组数据形式 6  7  8 client.connect(ip_port) 9 10 while True:11 12     msg = input(">>:").strip() # 获取客户端的输入信息并去除空格13 14     if len(msg) == 0:continue # 如果输入为空则继续循环等待输入15 16     client.send(msg.encode("utf-8"))  # 转码并发送给服务端17 18     res_return_size  = client.recv(1024) #接收这条命令执行结果的大小19     print("getting cmd result , ", res_return_size)20 21     total_rece_size = int(res_return_size)22     print("total size:",res_return_size)23 24     client.send(res_return_size.encode("utf-8"))25     received_size = 0 #已接收到的数据26     cmd_res = b''27     f = open("test_copy.html","wb")#把接收到的结果存下来,一会看看收到的数据 对不对28     while received_size != total_rece_size: #代表还没收完29         data = client.recv(1024)30         received_size += len(data) #为什么不是直接1024,还判断len干嘛,注意,实际收到的data有可能比1024少31         cmd_res += data32     else:33         print("数据收完了",received_size)34         #print(cmd_res.decode())35         f.write(cmd_res) #把接收到的结果存下来,一会看看收到的数据 对不对36         #print(data.decode()) #命令执行结果37 38 client.close()

 

程序缺限:

这是一个简单的socket通信,里面存在一些bug

1.在客户端输入回车,会挂死。

2.服务端返回的数据大于1024,客户端显示不全。

3.单进程,如果多个客户端连接,要排队,前一个断开,后一个客户端才能通信。

先贴一个多线程的导图:

 

转载于:https://www.cnblogs.com/neightchen/p/6743801.html

你可能感兴趣的文章
开源框架中常用的php函数
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
java 浅拷贝和深拷贝
查看>>
vue实例中中data属性三种写法
查看>>
uva1636 - Headshot(条件概率)
查看>>
iOS开发 runtime实现原理以及实际开发中的应用
查看>>
BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
查看>>
android 学习资源网址
查看>>
shell基础
查看>>
2018.1.15
查看>>
[集合DP] UVA 10651 Pebble Solitaire
查看>>
qt安装遇到的错误
查看>>