zoukankan      html  css  js  c++  java
  • 网络编程之socket

    网络编程

    第一阶段:简单版

    客户端

    import  socket
    
    # 买手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 买卡
    addr = ('127.0.0.1',8000)
    # 手机上安装卡
    client.connect(addr)
    
    
    # 发送消息
    client_msg = "hello world"
    client.send(bytes(client_msg.encode('utf-8')))
    
    
    # 接受消息
    data = client.recv(1024)
    print(data.decode("utf-8"))
    
    # 关闭连接
    client.close()
    

    服务端

    import socket
    
    # 买手机
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 买卡
    addr = ('127.0.0.1',8000)
    
    # 手机上安装卡
    server.bind(addr)
    
    # 设置手机最多能同时接五个电话
    server.listen(5)
    
    # 开始等待电话
    conn,addr = server.accept()
    
    # 接受client的电话
    client_msg = conn.recv(1024)
    print(client_msg.decode("utf-8"))
    
    # server回复消息给client
    msg = "我是服务端"
    conn.send(bytes(msg.encode('utf-8')))
    
    # 关闭连接
    conn.close()		
    server.close()
    

    PS:数据在传输的过程中,使用是二进制,所以我们需要将客户端,服务端中的数据转化为二进制传输(客户端:13行,服务端:24行),转化前需要使用utf8格式编码。

    第二阶段:交互式发送

    客户端

    import socket
    
    # 买手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 买卡
    addr = ('127.0.0.1',8000)
    # 手机上安装卡
    client.connect(addr)
    
    while True:
        # 发送消息
        client_msg = input("请输入发送的消息>>>>")
        client.send(bytes(client_msg.encode('utf-8')))
    
        # 接受消息
        data = client.recv(1024)
        print("服务端:",data.decode("utf-8"))
    

    服务端

    import socket
    
    # 买手机
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 买卡
    addr = ('127.0.0.1',8000)
    
    # 手机上安装卡
    server.bind(addr)
    
    # 设置手机最多能同时接五个电话
    server.listen(5)
    
    # 开始等待电话
    conn,addr = server.accept()
    
    while True:
        # 接受client的电话
        client_msg = conn.recv(1024)
        print(client_msg.decode('utf-8'))
    
        # server回复消息给client
        msg = "我是服务端"
        conn.send(bytes(msg.encode('utf-8')))
    

    此时我们可以实现客户端与服务端交互式发送消息,但是存在一些问题:

    a. 如果此时有另外一个客户端连接到服务端,客户端发送消息不会被接受

    b. 当客户端关闭后,服务端会异常退出.

    第三阶段:终极版

    客户端

    import socket
    
    # 买手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 买卡
    addr = ('127.0.0.1',8000)
    # 手机上安装卡
    client.connect(addr)
    
    while True:
        # 发送消息
        client_msg = input("请输入发送的消息>>>>")
        client.send(bytes(client_msg.encode('utf-8')))
    
        # 接受消息
        data = client.recv(1024)
        print("服务端:",data.decode("utf-8"))
    

    服务端

    import socket
    
    # 买手机
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 买卡
    addr = ('127.0.0.1',8000)
    
    # 手机上安装卡
    server.bind(addr)
    
    # 设置手机最多能同时接五个电话
    server.listen(5)
    
    while True:
        # 开始等待电话
        conn, addr = server.accept()
    
        while True:
            try:
                # 接受client的电话
                client_msg = conn.recv(1024)
                print(client_msg.decode('utf-8'))
    
                # server回复消息给client
                msg = "我是服务端"
                conn.send(bytes(msg.encode('utf-8')))
            except Exception:
                break
    

    此时当客户端退出后,再连接进来一个客户端 服务端也能正常工作!

    实现在客户端输入指令,服务端负责执行指令,同时返回结果

    客户端

    import socket
    
    # 买手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 买卡
    addr = ('127.0.0.1',8000)
    # 手机上安装卡
    client.connect(addr)
    
    while True:
        # 发送消息
        client_msg = input("请输入发送的消息>>>>")
        client.send(bytes(client_msg.encode('utf-8')))
    
        # 接受消息
        data = client.recv(2048)
        print("服务端:",data.decode('gbk'))		# 接受的编码为gbk,所以解码需要gbk
    

    服务端

    import socket
    import subprocess
    # 买手机
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 买卡
    addr = ('127.0.0.1',8000)
    
    # 手机上安装卡
    server.bind(addr)
    
    # 设置手机最多能同时接五个电话
    server.listen(5)
    
    while True:
        # 开始等待电话
        conn, addr = server.accept()
    
        while True:
            try:
                # 接受client的电话
                client_msg = conn.recv(1024)
                command = client_msg.decode('utf-8')
    			# 执行命令的模块
                obj = subprocess.Popen(command,
                                 shell=True,
                                 stderr=subprocess.PIPE,
                                 stdout=subprocess.PIPE
                                 )
    
                stdout = obj.stdout.read()
                stderr = obj.stderr.read()
                print(stderr, stdout)
    
                # server回复消息给client
                msg = stdout + stderr
                conn.send(msg)		# window输出的内容为编码为gbk
            except Exception:
                break
    
  • 相关阅读:
    解决打开GitHub慢的问题
    RestFramework规范简介
    在Linux中持久化运行项目
    Linux安装Mysql
    Java基础内容汇总[持续更新]
    Elasticsearch内容汇总[持续更新]
    深入源码理解SpringBean生命周期
    利用JVM钩子函数优雅关闭线程池
    聊聊消息队列高性能的秘密——零拷贝技术
    Elasticsearch性能优化汇总——写入&搜索
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11090609.html
Copyright © 2011-2022 走看看