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. 在Centos7中,从主机 Windows 上无法远程访问 Linux 上rabbitmq的解决方法

    当在 Linux 上配置好 Rabbitmq服务器后,如果从主机中无法访问到 Linux 中的Rabbitmq服务器时,需要做如下的检查: 1. Rabbitmq是否启动成功 在控制台输入: ps - ...

  2. Node.js环境安装

    为其他使用先小小的接触这个环境,如不出意外,未来的一些时候抽时间会系统的学习element-ui, JavaScript, vue, node.js, 稍后也做个简易的ACE Editor体验一下 1 ...

  3. Dubbo笔记(一)

    一.简介 在编写分布式场景下高并发.高扩展的系统对技能的要求很高,因为这个过程会涉及到序列化/反序列化.多线程.网络编程.设计模式.性能优化等众多专业知识.而Dubbo框架对这些专业知识做了更高层的抽 ...

  4. fastjson对String、JSONObject、JSONArray相互转换

    String——>>>JSONArray String st = "[{name:Tim,age:25,sex:male},{name:Tom,age:28,sex:mal ...

  5. NAT网络地址转化和DHCP

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的获得I ...

  6. 如何开发一个自己的npm包

    目录 一.初始化npm包 二.新建自己的工具类 三.新建入口文件index.js 四.编写单元测试 五.登录仓库 六.发布包 七.安装使用 八.删除包 一.初始化npm包 npm init 运行输入包 ...

  7. rust 神奇的特质

    pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> Strin ...

  8. VUE+ELEMENT-UI的后台项目封装组件--查询form的封装

    最近项目打算重构,项目的模块几乎都是以后台查询展示的传统的增删改差模式,所以卑微的我想要自己封装一下查询form,先上效果图 子组件页面: <template> <div class ...

  9. 人声提取工具Spleeter安装教程(linux)

    在安装之前,要确保运行Spleeter的计算机系统是64位,Spleeter不支持32位的系统.如何查看? 因为在linux环境下安装spleeter相对要简单很多,这篇教程先以Ubuntu20.04 ...

  10. 【服务器】VMware Workstation Pro虚拟机搭建本地服务器CentOs7和宝塔面板(保姆式教程)

    内容繁多,请耐心跟着流程走,在过程中遇到问题请在下面留言. 前言 这几天一直在复习thinkphp5.1,学习环境是phpStudy8.1,但是遇到了文件有缓存的问题(thinkphp5.1.39,修 ...