Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信

1. 操作系统的缓冲区

  • 缓存区

    1.为什么存在缓冲区?
    暂时存储一些数据.
    缓冲区存在如果网络波动,保证数据的收发稳定,匀速.
    2.缺点: 造成了粘包现象之一.

2. 基于TCP协议的socket循环通信

  • 服务端(server)

    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.1',8848))
    server.listen()
    # listen: 允许5个人链接我,剩下的链接也可以链接,等待. conn,addr = server.accept() # 等待客户端连接,阻塞状态中
    print(f'链接来了: {conn,addr}') while 1:
    try:
    # 等待接收客户端消息
    from_client_data = conn.recv(1024) # 最多接受1024字节
    # 客户端输入Q表示客户端正常退出
    if from_client_data.upper() == b'Q':
    print('客户端正常退出聊天了')
    break
    # 打印客户端的IP以及发送过来的消息
    print(f'来自客户端{addr}消息:{from_client_data.decode("utf-8")}')
    # 给客户端返回消息
    to_client_data = input('>>>').strip().encode('utf-8')
    conn.send(to_client_data)
    except ConnectionResetError:
    print('客户端链接中断了')
    break
    conn.close()
    server.close()
  • 客户端(client)

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8848)) while 1:
    to_server_data = input('>>>输入q或者Q退出').strip().encode('utf-8') # 服务端如果接受到了空的内容,服务端就会一直阻塞中,所以无论哪一端发送内容时,都不能为空发送
    if not to_server_data:
    print('发送内容不能为空')
    continue
    client.send(to_server_data) # 输入Q表示客户端正常退出
    if to_server_data.upper() == b'Q':
    break # 接收服务端返回的消息
    from_server_data = client.recv(1024) # 最多接受1024字节
    print(f'来自服务端消息:{from_server_data.decode("utf-8")}') client.close()

3. 基于TCP协议的socket链接+循环 通信

  • 服务端(server)

    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.1',8848)) # 必须是元组
    server.listen(2) while 1:
    conn,addr = server.accept() # 等待客户端连接,阻塞状态中
    print(f'链接来了: {conn,addr}') while 1:
    try:
    from_client_data = conn.recv(1024) # 最多接受1024字节 if from_client_data.upper() == b'Q':
    print('客户端正常退出聊天了')
    break print(f'来自客户端{addr}消息:{from_client_data.decode("utf-8")}')
    to_client_data = input('>>>').strip().encode('utf-8')
    conn.send(to_client_data)
    except ConnectionResetError:
    print('客户端链接中断了')
    break
    conn.close()
    server.close()
  • 客户端(client)

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8848)) while 1:
    to_server_data = input('>>>输入q或者Q退出').strip().encode('utf-8') if not to_server_data:
    print('发送内容不能为空')
    continue
    client.send(to_server_data)
    if to_server_data.upper() == b'Q':
    break
    from_server_data = client.recv(1024) # 最多接受1024字节
    print(f'来自服务端消息:{from_server_data.decode("utf-8")}') client.close()

4. 基于TCP协议的socket应用实例:执行远程命令

  • 服务端(server)

    import socket
    import subprocess server = socket.socket()
    server.bind(('127.0.0.1',8848))
    server.listen(2) while 1:
    conn,addr = server.accept() # 等待客户端链接我,阻塞状态中
    print(f'链接来了: {conn,addr}') while 1:
    try:
    from_client_data = conn.recv(1024) # 最多接受1024字节 if from_client_data.upper() == b'Q':
    print('客户端正常退出聊天了')
    break # 执行远程命令
    obj = subprocess.Popen(from_client_data.decode('utf-8'),
    shell=True,
    # 执行正确指令的管道
    stdout=subprocess.PIPE,
    # 执行错误指令的管道
    stderr=subprocess.PIPE, )
    # 将正确指令以及错误指令得到的结果返回给客户端
    result = obj.stdout.read() + obj.stderr.read()
    conn.send(result)
    except ConnectionResetError:
    print('客户端链接中断了')
    break
    conn.close()
    server.close() # shell: 命令解释器,相当于调用cmd 执行指定的命令。
    # stdout:正确结果丢到管道中。
    # stderr:错了丢到另一个管道中。
    # windows操作系统的默认编码是gbk编码。
  • 客户端(client)

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8848)) while 1:
    to_server_data = input('>>>输入q或者Q退出').strip().encode('utf-8') if not to_server_data:
    print('发送内容不能为空')
    continue
    client.send(to_server_data)
    if to_server_data.upper() == b'Q':
    break
    from_server_data = client.recv(1024) # 最多接受1024字节
    print(f'{from_server_data.decode("gbk")}') client.close()

5. socketserver通信

  • server服务端

    import socketserver
    
    class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
    while 1:
    from_client_msg = self.request.recv(1024).decode('utf-8')
    print(f'来自客户端{self.client_address}的消息:',from_client_msg)
    to_client_msg = input('>>>')
    self.request.send(to_client_msg.encode('utf-8')) if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),Myserver)
    server.serve_forever()
  • client客户端

    import socket
    client = socket.socket()
    client.connect(('127.0.0.1',8888))
    while 1:
    to_server_msg = input('>>>').encode('utf-8')
    client.send(to_server_msg)
    from_server_msg = client.recv(1024)
    print('来自服务端的消息:',from_server_msg.decode('utf-8'))
    client.close()

Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信的更多相关文章

  1. Python网络编程基础 ❸ struct模块 基于upd的socket服务

    struct模块 基于upd的socket服务

  2. (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

    1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...

  3. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

  4. 【TCP/IP网络编程】:04基于TCP的服务器端/客户端

    摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...

  5. unix网络编程第四章----基于TCP套接字编程

    为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...

  6. python网络编程【二】(使用TCP)

    1.建立socket 对于一个客户端程序来说,建立一个socket需要两个步骤.首先,您需要建立一个实际的socket对象.其次,您需要把它连接到远程服务器上. 在建立socket对象的时候,您需要告 ...

  7. 网络编程[第三篇]基于tcp协议实现远程连接

    需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...

  8. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

  9. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

随机推荐

  1. SDL2 gif动态图加载

    参照 https://tieba.baidu.com/p/3569073088?tpl=5&red_tag=1777318765 使用mingw工具链 #include <stdbool ...

  2. 命令中"|"的意义

    管道命令,是指 | 的左边运行结果是|右边的输入条件或者范围.如:history | grep date指从history这条命令运行的结果中显示包含有 “date” 的命令 下面举一个例子: 这是运 ...

  3. docker-mcr 助您全速下载 dotnet 镜像

    2018 年五月之后,微软将后续发布的所有 docker image 都推送到了 MCR (Miscrosoft Container Registry),但在中国大陆,它的速度实在是令人发指,本文将介 ...

  4. java中int和Integer的区别?为什么有了int还要有设计Integer?

    参考https://blog.csdn.net/chenliguan/article/details/53888018 https://blog.csdn.net/myme95/article/det ...

  5. 浅谈typeof 和instanceof

    typeof vs instanceof 涉及面试题:typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么? typeof 对于原始类型来说,除了 null 都可以显示正 ...

  6. Beta冲刺<9/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第九天(05.27) 作业正文 如下 其他参考文献 ... B ...

  7. JavaWeb网上图书商城完整项目--21.用户模块各层相关类的创建

    1.现在要为user用户模块创建类 用户模块功能包括:注册.激活.登录.退出.修改密码. User类对照着t_user表来写即可.我们要保证User类的属性名称与t_user表的列名称完全相同. 我们 ...

  8. 【秒懂Java】【第1章_初识Java】01_编程语言

    各位小伙伴们好哇!从今日起,我将开始更新<秒懂Java>系列文章,从0开始讲解Java的方方面面,后面也将推出配套的视频版,欢迎大家保持关注! 我会尽力办到:在保证通俗易懂的同时,不丢失知 ...

  9. github知名企业开源项目索引

    亚马逊:https://github.com/amzn 饿了么 https://github.com/ElemeFEhttp://lrd.ele.me/腾讯 https://github.com/Te ...

  10. 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?

    目录 1.交互实现 1.1 meta标签:自动刷新/跳转 1.2 title标签:消息提醒 2.性能优化 2.1 script标签:调整加载顺序提升渲染速度 2.2 link标签:通过预处理提升渲染速 ...