zoukankan      html  css  js  c++  java
  • socket练习

    作业要求:
    1、服务端可以接受多个客户端(3个以上)
    2、每个客户端生成一个线程处理接受请求

    环境说明:

    server端运行Centos7,Python2.7

    client可以是linux和win7

    本程序通过sshserver.py和sshclient.py实现

    sshserver.py

    #!/usr/bin/env python 
    #coding:utf8
    
    import  socket
    from  subprocess import PIPE,Popen
    import  threading
    import time
    from datetime import  datetime
    
    def getIP():
        cmd = "/sbin/ifconfig |grep 'netmask' |awk '{print $2}'|grep -v '127.0.0.1'"
        p = Popen(cmd,stdout=PIPE,stderr=PIPE,shell=True)
        stdout, stderr = p.communicate()
        return  stdout.strip()
    ip = getIP()
    
    # host = "192.168.88.100"
    host = ip
    port = 12345
    
    def get_result(cmd):
        p = Popen(cmd, stdout=PIPE,stderr=PIPE, shell=True)
        stdout, stderr = p.communicate()
        stdout = stdout.strip()
        stderr = stderr.strip()
        return  stdout,stderr
    
    def get_content(conn,content,timeNow):
        if content:
            len_size_stdout = len(content)
            conn.sendall("{0}".format(len_size_stdout))
            print("{0}: {1}".format(timeNow, content))
            conn.sendall("{0}".format(content))
    
    def send_message(conn,addrclient):
        status = 1
        while True:
            Now = datetime.now()
            timeNow = Now.strftime("%Y-%m-%d %H:%M:%S")
            try:
                cmd = conn.recv(2048)
            except Exception as e :
                # raise  e
                print("{0} 客户端:{1}异常退出".format(timeNow,addrclient))
                break
            if len(cmd) > 0:
                status = 1
                print("{0}: {1}".format(timeNow, cmd))
                stdout,stderr = get_result(cmd)
                if stdout:
                    len_size_stdout = len(stdout)
                    conn.sendall("{0}".format(len_size_stdout))
                    print("{0}: {1}".format(timeNow, stdout))
                    conn.sendall("{0}".format(stdout))
                if stderr:
                    len_size_stdout = len(stderr)
                    conn.sendall("{0}".format(len_size_stdout))
                    print("{0}: {1}".format(timeNow, stderr))
                    conn.sendall("{0}".format(stderr))
            else:
                status += 1
                time.sleep(1)
                if status == 5:
                    break
        print("{0} : {1} close socket!!!".encode('utf-8').format(timeNow,addrclient))
        conn.close()
    
    def multil_worler(socket):
        while True:
            conn, addrclient = socket.accept()
            thread = threading.Thread(target=send_message,args=(conn,addrclient))
            print(thread.getName())
            print("线程name:{1} 连接服务器IP:{0}".format((addrclient),thread.getName()))
            thread.start()
    
    def main():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind((host, port))
        print("服务器主机host:{0},端口:{1}".format(host, port))
        sock.listen(5)
        multil_worler(sock)
    
    
    if __name__ == "__main__":
        main()
    

      

    sshserver.py

    #!/usr/bin/env python 
    #coding:utf8
    import socket
    import time
    
    host = "172.16.61.158"
    port = 12345
    
    def send_message(s):
        status = 1
        while True:
            cmd = raw_input("[root@zhan-01 ~]# ")
            if cmd.upper() == "EXIT":
                print("client {0},bye bye!".format(host))
                break
            elif cmd:
                s.sendall(cmd)
                print(cmd)
                # s.sendall(cmd.encode("utf-8"))
                len_size = s.recv(2048)
                num = int(len_size) / 2048
                print( int(len_size) ,2048)
                if num <1:
                    data = s.recv(2048)
                    print(data)
                else:
                    if int(len_size) % 2048 != 0:
                        new_num  = num + 1
                    new_data = ""
    
                    while True:
                        data1 = s.recv(2048)
                        # Python3
                        # new_data  += str(data,encoding="utf8")
                        # Python2
                        new_data = new_data + data1
                        #第一次为N-1
                        new_num = new_num -1
                        time.sleep(0.5)
                        if int(new_num) == 0:
                            break
                    print(new_data)
            else:
                status += 1
                time.sleep(1)
                if status == 5:
                    break
        s.close()
    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        send_message(s)
    
    if __name__ == "__main__":
        main()
    

      

    运行结果:

    启动服务端:

    启动客户端(linux和Win):

    1 Linux客户端运行:

    client:

    server:

    ——————————————————————————————————————————————————————————————

    2 Win运行:

    client:

    server端日志:

  • 相关阅读:
    springboot日志框架
    springboot创建一个可执行的jar
    springboot整合Thymeleaf模板引擎
    springboot自定义SpringApplication启动类
    springboot配置mybatis的mapper路径
    使用@SpringBootApplication注解
    HDU1269 迷宫城堡 —— 强连通分量
    POJ3177 Redundant Paths —— 边双联通分量 + 缩点
    HDU3394 Railway —— 点双联通分量 + 桥(割边)
    UVA796 Critical Links —— 割边(桥)
  • 原文地址:https://www.cnblogs.com/pythonlx/p/8184884.html
Copyright © 2011-2022 走看看