zoukankan      html  css  js  c++  java
  • Python网络编程--Echo服务

    Python网络编程--Echo服务

    学习网络编程必须要练习的三个小项目就是Echo服务,Chat服务和Proxy服务。在接下来的几篇文章会详细介绍。

    今天就来介绍Echo服务,Echo服务是最基本的服务。它的主要特点就是连接与连接之间没有通信。

    1. 一问一答Echo

    根据官网上的例子,做简单的修改。

    echo_server.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """Echo server program
    """
    
    import socket
    
    HOST = ''
    PORT = 50007
    
    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((HOST, PORT))
        s.listen(1)
        while True:
            conn, addr = s.accept()
            print('Connected by {}'.format(addr))
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                conn.sendall(data)
            conn.close()
    
        s.close()
    
    if __name__ == '__main__':
        main()

    echo_client.py 输入为空时,关闭连接。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """Echo client program
    """
    
    import socket
    
    HOST = 'localhost'
    PORT = 50007
    
    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((HOST, PORT))
        while True:
            data = raw_input('> ')
            if not data:
                break
            s.sendall(data)
            data = s.recv(1024)
            if not data:
                break
    
            print('{}'.format(data))
        s.close()
    
    if __name__ == '__main__':
        main()

    先运行服务器程序,再启动客户端程序,如下:
    服务器:
    echo_server
    客户端:
    echo_client

    2. 输入与输出不同

    要实现输入与输出不同,就需要解决输入的内容,根据不同的输入(指令)给出不同的应答。

    下面我们实现以下几个小功能:
    - 输入date,返回当前的日期与时间。
    - 输入os,返回操作系统信息。
    - 输入ls,列出当前目录的清单。输入ls dir,返回dir目录的文件清单。

    echo_server.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """Echo server program
    """
    
    import socket
    import time
    import os
    
    HOST = ''
    PORT = 50007
    
    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # enable address reuse
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        s.listen(1)
        while True:
            conn, addr = s.accept()
            print('Connected by {}'.format(addr))
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                elif data == 'date':
                    data = get_date()
                elif data == 'os':
                    data = get_os()
                elif data.startswith('ls'):
                    data = get_ls(data[2:])
    
                conn.sendall(data)
            conn.close()
    
        s.close()
    
    
    def get_date():
        return time.ctime()
    
    
    def get_os():
        return os.name
    
    
    def get_ls(dire):
        if not dire.strip():
            dire = os.curdir
    
        return '
    '.join(os.listdir(dire.strip()))
    
    
    if __name__ == '__main__':
        main()

    echo_client.py 没有变化。

    效果如下:

    服务器:

    echo_server

    客户端:

    echo_client

    总结

    通过上面的两上小练习,所有类似Echo都应该可以完成了。可以在其基础上进行扩充。比如实现一上HTTP服务器。

  • 相关阅读:
    React项目安装过程及node版本太老引发问题
    利用git上传、拉取代码,密码和用户名字不正确时,如何操作
    Vue和react的优缺点
    同步异步差别
    深拷贝和浅拷贝区别
    vue项目引用Swiper.js在低版本浏览器出现错误
    uniApp h5分享实现
    input上传图片样子太丑了,实现美化的tips
    关于cli3.0跨域的处理
    webpack4.0
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710131.html
Copyright © 2011-2022 走看看