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. mail邮件操作

    目录 1. 概念 1.1. 常见的类型 1.2. 相关协议 1.3. SMTP协议 2. python::smtplib 1. 概念 1.1. 常见的类型 Mail User Agent 收发邮件用的 ...

  2. Jlink设置正确,但下载程序失败

    [图中reset and run]勾选后即每次·下载程序后会自动复位,不需要再在硬件上进行复位 各参数设置正确 但依然下载失败. 原因是需要重新再编译一次,因为上次设置错误,编译后目标未创建! 重新编 ...

  3. 【JMeter_18】JMeter逻辑控制器__吞吐量控制器<Throughput Controller>

    吞吐量控制器<Throughput Controller> 业务逻辑: 他的实际作用似乎跟吞吐量扯不上什么关系.就是单纯的控制控制器下的子节点被执行的次数或被执行比列,该控制器默认为多线程 ...

  4. 用VC++6.0,双击主对话框中的按钮时,不能跳转到代码处

    1. 首先在项目中--[生成]build--[清除解决方案]clean 2. 关闭项目 3. 删除项目中的[Debug]下所有文件 4. 把*.aps,*.clw,*.ncb,*.opt删掉----- ...

  5. Beta冲刺<9/10>

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

  6. < react router>: (路由)

    < react router> (路由): 思维导图: Atrial   文件夹下的index.js 文件内容: import React, { Component } from 'rea ...

  7. 一个非侵入的Go事务管理库——如何使用

    在文章"清晰架构(Clean Architecture)的Go微服务: 事物管理"中,我谈到了如何在清晰架构中实现非侵入的事务管理. 它允许你把事务代码与业务逻辑代码分开,并且让你 ...

  8. 解决github打不开问题

    2020.06.22 使用以下方式: 在https://github.com.ipaddress.com/找到: 在https://fastly.net.ipaddress.com/github.gl ...

  9. Jmeter系列(27)- 详解正则提取器

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 有了 JSON 提取器为啥还要用正则提 ...

  10. spring boot actuator端点高级进阶metris指标详解、git配置详解、自定义扩展详解

    https://www.cnblogs.com/duanxz/p/3508267.html 前言 接着上一篇<Springboot Actuator之一:执行器Actuator入门介绍>a ...