zoukankan      html  css  js  c++  java
  • python 基于TCP协议的套接字编程

    基于TCP协议的套接字编程

    实现电话沟通为例,这里传递的是字符,可以自己尝试去发送一个文件

    # 服务端
    import socket
    # 1. 符合TCP协议的手机
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # TCP
    
    # 2. 绑定手机号 一个服务器,我们自己的电脑作为服务器的话,用自己的IP地址
    server.bind(('127.0.0.1',8000))  # 127.0.0.1 代表本地
    # server.bind(('192.168.11.251',8000))  
    
    server.listen(5) # 半连接池  可以同时接收5个客户端
    # 3. 等待客户端连接
    print('start...')
    # 链接循环
    while True:
        # 通信循环
        conn,client_addr = server.accept()
        while True:
            try:
                # 4. 收到信息 receive
                data = conn.recv(1024) # 每次接收多少字节,如果改为10,客户端输入dir,(可以在cmd中输入 dir,看看会得到什么) ,会出现什么情况呢,下次的博客会讲到粘包问题,以及如何处理粘包问题
                print(data)
                # 5. 回消息
                conn.send(data.upper())
            except ConnectionAbortedError:
                continue
            except ConnectionResetError:
                break
    
    # 客户端1
    import socket
    
    # 1. 创建符合TCP协议的手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 2. 拨号
    client.connect(('127.0.0.1',8000))
    
    while True:
        msg = input('please enter your msg') # dir
        # 3. 发送消息
        client.send(msg.encode('utf8'))
        
        # 4. 接收消息
        data = client.recv(1024)
        print(data)
    
    # 客户端2
    import socket
    
    # 1. 创建符合TCP协议的手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 2. 拨号
    client.connect(('127.0.0.1',8000))
    # msg = input('please enter your msg>>>')
    
    # 3. 发送消息
    client.send('hello'.encode('utf8'))
    client.send('world'.encode('utf8'))
    
    # 4. 接收信息
    data = client.recv(1024)
    print(data)
    
    

    模拟ssh远程执行命令(linux系统)

    # ssh服务端
    import socket
    import subprocess
    
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    server.bind(('192.168.11.251',8000))  # 这是我的机子,客户端可以是其他人的机子
    server.listen(5)
    
    print('start...')
    while True:
        conn,cient_addr = server.accept()
        print(client_addr) # 打印出的是其他人机子的IP
        
        while True:
            try:
                cmd = conn.recv(1024) # dir
                print(cmd)
                
                # 帮你执行cmd命令,然后把执行结果保存到管道里
                pipeline = subprocess.Popen(cmd.decode('utf8'),
                                           shell = True,
                                           stderr = subprocess.PIPE, # std 标准
                                           stdout = subprocess.PIPE)
                
                stderr = pipeline.stderr.read()
                stdout = pipeline.stdout.read()
                
                conn.send(stderr)
                conn.send(stdout)
            except ConnectionResetError:
                break
    
    # ssh客户端
    import socket
    
    # 1.创建符合TCP协议的手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 2. 拨号
    client.connect(('192.168.11.210',8000))
    
    while True:
        msg = input('please enter your msg') # dir
        # 3. 发送消息
        client.send(msg.encode('utf8'))
        
        # 4. 接收消息
        data = client.recv(10)
        print(data.decode('gbk')) # 在mac电脑上可能是'utf8'
    

    学习最有效的方法一定是有输入,一定要输出,这样学的东西才能真正得有用

  • 相关阅读:
    阿里P8推荐的SpingBoot学习手册+Git开源项目实践分享,还不收藏
    阿里P8划重点:JVM+Spring+Mybatis+多线程高并发源码你必须会
    一线大厂工程师推荐:Mysql、Springboot、JVM、Spring等面试合集
    GitHub标星120K+的JDK并发编程指南,连续霸榜GitHub终于开源了
    腾讯被指劝退高龄员工,华为百度也在优化,互联网35岁+该怎么办
    天猫面试官硬核推荐:Dubbo+ES+JVM+多线程/高并发+消息队列
    多线程与高并发:金九银十跳槽季面试必须要掌握的硬核涨薪技能
    纯干货,源码6步曲,带你解析完整的ThreadPoolExecutor
    今日总结
    今日头条技术架构分析
  • 原文地址:https://www.cnblogs.com/geyatou322/p/11093020.html
Copyright © 2011-2022 走看看