• Python Socket 通信


    参考: http://www.cnblogs.com/alex3714/articles/5830365.html

    Socket

    • network socket is an endpoint of a connection across a computer network. Today, most communication between computers is based on the Internet Protocol; therefore most network sockets are Internet sockets. More precisely, a socket is a handle (abstract reference) that a local program can pass to the networking application programming interface (API) to use the connection, for example "send this data on this socket".
    • 实现步骤 (伪代码:)
    • Socket socket = getSocket(type = "TCP")  #设定好协议类型
      connect(socket, address = "1.2.3.4", port = "80") #连接远程机器
      send(socket, "Hello, world!") #发送消息
      close(socket) #关闭连接

    简单Socket 实例

    1. 客户端

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    # 客户端
    import socket
    client = socket.socket()  # 声明socket类型, 同时生成socket链接对象
    client.connect(('localhost', 6969))
    
    client.send(b"Hellow World")  # 只能接收字节类型, 所以要加b转一下
    
    data = client.recv(1024)  # 收1024个字节
    print("recv: ", data)
    
    
    client.close()
    客户端

    2. 服务端

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
    要实现对话:
        1. 需要用多线程, 服务器端和客户端交叉执行才能完成一个对话;
        2. 用异步也可以实现
        3. 最简单的, 哪个实例发过来的, 就用哪个实例接收(在代码执行窗口手动切换 client端和服务端).
    """
    
    # 服务器端
    import socket
    server = socket.socket()  # 不传入参数就是使用构造方法的默认参数设置
    server.bind(('localhost', 6969))  # 绑定要监听的端口
    server.listen()  # 监听
    
    print("我要开始等电话了")
    conn, addr = server.accept()  # 等电话打进来. server.accept()返回两个值,分别赋给conn, addr.
    # conn就是客户端连过来而在服务器端为其生成的一个连接实例
    
    print(conn, addr)
    
    print("电话来了")
    
    
    # data = server.recv(1024)  # 开始接收对方发过来的信息
    data = conn.recv(1024)  # 谁打来的电话, 跟谁聊
    print("recv: ", data)
    # server.send(data.upper())
    conn.send(data.upper())
    
    server.close()
    服务端

    实现效果:

    挂起多个客户端实例.

    客户端: 

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """
    重复发送和接收多次:
    1. 实现用户输入
    """
    
    import socket
    
    
    client = socket.socket()  # 声明socket类型, 同时生成socket连接对象
    client.connect('localhost', 6969)
    
    while True:
        msg = input(">>: ").strip()
        if len(msg) == 0: continue  # 不能发空的. 否则系统以为用户还在输入, 会一直等.
        client.send(msg.encode("utf-8"))
        data = client.recv(1024)
        print("recv: ", data.decode())  # 把utf-8转成unicode
    
    
    client.close()
    client端

    服务器端:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """
    下面这段在linux执行时, 如果client端断开, server端会陷入死循环.
    在window里, 如果client端断开, server端也会断开.
    
    要克服上述问题, 要加个判断, 如果接收的信息是空, 断开循环. (见第二段代码)
    
    """
    # 服务器端
    import socket
    server = socket.socket()  # 不传入参数就是使用构造方法的默认参数设置
    server.bind(('localhost', 6969))  # 绑定要监听的端口
    server.listen()  # 监听
    
    print("我要开始等电话了")
    conn, addr = server.accept()  # 等电话打进来. server.accept()返回两个值,分别赋给conn, addr.
    # conn就是客户端连过来而在服务器端为其生成的一个连接实例
    
    print(conn, addr)
    
    print("电话来了")
    
    
    # data = server.recv(1024)  # 开始接收对方发过来的信息
    data = conn.recv(1024)  # 谁打来的电话, 跟谁聊
    print("recv: ", data)
    # server.send(data.upper())
    conn.send(data.upper())
    
    server.close()
    
    
    
    """
    上面这段代码实现的是如果client端断开, server端也随之断开. 但是server应该还能接收新的电话进来 . 所以要加循环.
    """
    #
    import os
    import socket
    server = socket.socket()  # 不传入参数就是使用构造方法的默认参数设置
    server.bind(('localhost', 6969))  # 绑定要监听的端口
    server.listen()  # 监听. server.listen(5)代表最多能挂起5个client端(不断开, 排队), 但这种情况要在异步情形下才能测出来.
    
    print("我要开始等电话了")
    
    while True:  #即使当前client端断开, 还可以等新的电话
        conn, addr = server.accept()  # 等电话打进来. server.accept()返回两个值,分别赋给conn, addr.
        # conn就是客户端连过来而在服务器端为其生成的一个连接实例
    
        print(conn, addr)
        print("电话来了")
    
    
        while True:
            # data = server.recv(1024)  # 开始接收对方发过来的信息
            data = conn.recv(1024)  # 谁打来的电话, 跟谁聊. 一次最多收10240字节.
            print("recv: ", data)
            if not data:
                print("client has lost...")
                break  # 切断循环
            res = os.popen(data).read()     # 打印执行结果
            # server.send(data.upper())
            # conn.send(data.upper())
            conn.send(res)
    
    server.close()
    server端
  • 相关阅读:
    router-link中传值的三种方式
    JVM原理和优化
    JAVA中关于锁机制
    思考程序
    论防御式编程与攻击式编程
    BOM详解
    理解JAVASCRIPT 闭包
    用HTML5 CANVAS做自定义路径的动态效果图片!
    js制作点击会自动隐藏的导航栏(固定在在头部的)
    ++a和a++的区别。
  • 原文地址:https://www.cnblogs.com/cheese320/p/9232089.html
Copyright © 2020-2023  润新知