zoukankan      html  css  js  c++  java
  • Python学习---Socket编程

    1.1. Socket -服务端/客户端编程

       应用程序两端通过“套接字”向网络发出请求或者应答网络请求。可以把socket理解为通信的把手(hand),是一个接口,封装了大量方法

       socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。socket的英文原义是“插槽”或“插座”,就像我们家里座机一样,如果没有网线的那个插口,电话是无法通信的。Socket是实现TCP,UDP协议的接口,便于使用TCP,UDP。

    注意:Socket不能发送为空的字符[直接回车]

    image

    image

    1.2 单人聊天

    服务器端:

    # 服务端
    import socket
    
    # family=AF_INET,   代表使用IPV4的IP协议
    # type=SOCK_STREAM  代表使用TCP协议进行连接
    
    server = socket.socket()  # 创建socket
    ip_addr = ('127.0.0.1', 9999)  # 1024之前的端口,默认是OS使用
    server.bind(ip_addr)           # 要求必须是一个元组
    server.listen(3)               # 开始监听传入连接。在拒绝连接之前,可以挂起的最大连接数量。
    while True:
        conn, addr = server.accept()  # 接受连接并返回(conn,address)
                                      # 其中conn是新的套接字对象[客户端],可以用来接收和发送数据。
                                      # address是连接客户端的地址。
        exit_flag = True
        while exit_flag:
            print('当前连接对象', addr)
            # 发送一定要有接收
            try:
                data = conn.recv(1024)
                print('服务器:', str(data, 'utf-8'))
                inp = input('>>>:')
                if inp != 'bye':
                    conn.send(bytes(inp, 'utf-8'))
                    exit_flag = True
                else:
                    conn.send(bytes(inp, 'utf-8'))
                    exit_flag = False
            except Exception as e:
                print('已关闭当前连接对象', addr, '等待连接...')
                exit_flag = False
            finally:
                conn.close()
    server.close()

    客户端:

    # 客户端
    import socket
    
    # family=AF_INET,   代表使用IPV4的IP协议
    # type=SOCK_STREAM  代表使用TCP协议进行连接
    
    client = socket.socket()
    ip_addr = ('127.0.0.1', 9999)
    try:
        client.connect(ip_addr)
        exit_flag = True
        while exit_flag:
            # 发送一定要有接收
            inp = input('>>>:')
            if inp != 'bye':
                client.send(bytes(inp, 'utf-8'))
                exit_flag = True
            else:
                client.send(bytes(inp, 'utf-8'))
                exit_flag = False
            info = client.recv(1024)  # 最大接收1024K数据,# 传送/接收的数据一定是byte类型
            print('客户端:', str(info, 'utf-8'))
    except Exception as e:
        print('客户端关闭连接', e)
    finally:
        client.close()

    1.3 多人聊天

    Server:

    import socket
    import select
    sk=socket.socket()
    sk.bind(("127.0.0.1",8801))
    sk.listen(5)
    inputs=[sk,]
    while True:
        r,w,e=select.select(inputs,[],[],5)
        print(len(r))
        for obj in r:
            if obj==sk:
                conn,add=obj.accept()
                print(conn)
                inputs.append(conn)
            else:
                data_byte=obj.recv(1024)
                print(str(data_byte,'utf8'))
                inp=input('回答%s号客户>>>'%inputs.index(obj))
                obj.sendall(bytes(inp,'utf8'))
        print('>>',r)  

    client:

    import socket
    sk=socket.socket()
    sk.connect(('127.0.0.1',8801))
    
    while True:
        inp=input(">>>>")
        sk.sendall(bytes(inp,"utf8"))
        data=sk.recv(1024)
        print(str(data,'utf8'))
    

      

  • 相关阅读:
    贪心:SPOJ Backup Files
    杂题 SPOJ MOBILE2
    杂题 UVAoj 10000 Longest Paths
    杂题 UVAoj 107 The Cat in the Hat
    DP(斜率优化):HDU 3507 Print Article
    搜索(DLX): POJ 3074 3076 Sudoku
    DLX模板
    PHP代码优化技巧大盘点
    盘点PHP编程常见失误
    PHP Socket 编程详解
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9383723.html
Copyright © 2011-2022 走看看