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. vue-toy: 200行代码模拟Vue实现

    vue-toy 200行左右代码模拟vue实现,视图渲染部分使用React来代替Snabbdom,欢迎Star. 项目地址:https://github.com/bplok20010/vue-toy ...

  2. mysql索引小总结

    MySql 1.索引 mysql索引默认使用的是B+Tree(B-树的变种版).也可以使用HASH表. 二叉树: 二叉树又称二叉搜索树,二叉排序树,特点如下: 左子树上所有结点值均小于根结点 右子树上 ...

  3. tensorflow-TFRecord 文件详解

    TFRecord 是 tensorflow 内置的文件格式,它是一种二进制文件,具有以下优点: 1. 统一各种输入文件的操作 2. 更好的利用内存,方便复制和移动 3. 将二进制数据和标签(label ...

  4. cb46a_c++_STL_算法_逆转和旋转reverse_rotate函数advance

    cb46a_c++_STL_算法_逆转和旋转reverse_rotateSTL算法--变序性算法reverse() 逆转reverse_copy()一边复制一般逆转rotate()旋转,某个位置开始前 ...

  5. docker镜像瘦身思路

    docker镜像瘦身思路 一.简介 docker镜像太大,带来了以下几个问题: 存储开销 这块影响其实不算很大,因为对服务器磁盘来说,15GB的存储空间并不算大,除非用户服务器的磁盘空间很紧张 部署时 ...

  6. 团队Github实践训练

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 团队Github实践训练 这个作业的目标 通过github实现团队协作编码 作业正 ...

  7. WIN7系统安装photoshop CS6出现配置错误:16的解决方法

  8. 手把手教你学Numpy,搞定数据处理——收官篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...

  9. linux 上设置mysql开机自启

    此方式是通过安装包安装的,如果是yum安装的rpm包,可参考yum安装MySQL8.0 三个月之前安装的mysql,记得是设置了开机自启,但是今天再次进入的时候发现,无法登录,报错如下 原因是mysq ...

  10. Windows 安装RabbitMQ后,启动服务就自动停止

    在做SpringCloud消息总线的时候,需要用到RabbitMQ,于是在windows上下载安装了一个,erlang的安装包不是官网下载的,而是朋友分享给我的,没注意它的版本(9.3). 安装完成后 ...