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
    
  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11090609.html
Copyright © 2011-2022 走看看