def client_sender(buffer):
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)##定义socket类型,网络通信,TCP
    #Python 提供了两个基本的 socket 模块。
    #第一个是 Socket,它提供了标准的 BSD Sockets API。
    #第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
    #socket.AF_INET 服务器之间网络通信
    #socket.SOCK_STREAM 流式socket , for TCP
    try:
        # 连接到目标主机
        client.connect((target,port))#连接到远程 主机 跟端口

        if len(buffer): # 1 号 代码段 如果 有要发送的数据
            client.send(buffer) # 进行发送

        while True:# 死循环啊 你在等待什么呢
            # 现在等数据回传
            recv_len = 1 # 做了一个 登录 了 监听
            response = ""# 返回的数据 仓库

            while recv_len: # 2号 代码段 当 这里,其实这里一直存在,内部的 死循环
                # 拿回原来的 数据

                data = client.recv(4096)# 一直在等待返回的数据
                recv_len = len(data)# 等待 返回的数据
                response+=data# 累加 数据

                if recv_len < 4096:# 如果返回的数据少于4096
                    break
            print response,#打印返回的结果

            # 等待更多输入
            buffer = raw_input("") # 3 号 代码段 重新的等待 输入信息
            buffer += "\n" # 添加换行

            #发出去
            client.send(buffer)# 然后在发送出去

    except:# 这里 根本就是个死循环啊,没有异常

        print "[*] Exception! Exiting."

        #关闭连接
        client.close()
"""
_____________________________________________________________________________________________________________
    现在你应该熟悉这些代码了,我们从建立一个TCP套接字对象开始,首先检测是否已经从标准输入中接收到了数据1。如果一切
    正常,我们就将数据发送给远程主机并接收回传数据2,直到没有更多的数据发送回来,然后我们等待用户下一步的输入3并继
    续发送和接收数据,直到用户结束脚本运行。

    下面附件的那行用来对用户的输入进行特殊处理,这样我们的客户端就能与命令行shell兼容。现在,我们继续创建服务器段
    的主循环和子函数,用来对命令行shell的创建和命令执行进行处理。
_____________________________________________________________________________________________________________
"""

本文转载自麦子学院:http://q.maiziedu.com/article/23229/