zoukankan      html  css  js  c++  java
  • 代码块分享

    需要经常练习的代码

    使用套接字进行

    # 使用套接字实现多用户连接服务端实现通信
    
    # 服务端
    import socket  # socket是一个套接字,可以写一套C/S架构,简单的说就是可以写客户端与服务端。
    
    server = socket.socket()
    server.bind(('127.0.0.2',9000))
    server.listen(5)    # 半连接池
    
    while True:
        conn, addr = server.accept() # 进行监听
        print(addr)
        while True:
            try:
                # 接听消息
                date = conn.recv(1024)
                # 对消息进行判断
                if date == 'q':
                    break
    
                if len(date) == 0:
                    continue
    
                print(date.decode('utf-8'))
    
                conn.send(date)
    
            except Exception as e:
                print(e)
                break
    
    # 客户端
    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.2',9000))  # 进行三次握手
    
    #开始向服务端发送消息
    while True:
        # 发送
        send_msg = input('请输入》》')
        client.send(send_msg.encode('utf-8'))  # 发送的时候进行转码
    
        # 接收
        date = client.recv(1024)
        print(date.decode('utf-8'))
    
    # 总结:这种写法只能同时使一个用户来连接服务端进行使用,当一个用户结束之后,另一个用户才能进行使用。
    

    基于TCP实现服务端并发执行

    # TCP服务端使用线程实现并发
    '''
    服务端的工作:
    1.能同时接收每个客户端的请求,不需要一个用户停止,下一个用户才能使用
    2.24小时不间断提供服务
    3.实现并发
    '''
    
    # 服务端
    import socket  # socket是一个套接字,可以写一套C/S架构,简单的说就是可以写客户端与服务端。
    from threading import Thread
    
    server = socket.socket()
    server.bind(('127.0.0.2',9000))
    server.listen(5)    # 半连接池
    print('启动都无端...')
    
    def task(conn):
        while True:
            try:
                # 接听消息
                date = conn.recv(1024)
                # 对消息进行判断
                if date == 'q':
                    break
    
                if len(date) == 0:
                    continue
    
                print(date.decode('utf-8'))
    
                conn.send(date)
    
            except Exception as e:
                print(e)
                break
        conn.close()
    
    while True:
        conn, addr = server.accept()  # 进行监听
        print(addr)
        t = Thread(target=task,args=(conn,))
        t.start()
    
        
    # 客户端
    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.2',9000))  # 进行三次握手
    
    #开始向服务端发送消息
    while True:
        # 发送
        send_msg = input('请输入》》')
        client.send(send_msg.encode('utf-8'))  # 发送的时候进行转码
    
        # 接收
        date = client.recv(1024)
        print(date.decode('utf-8'))
        
    # 总结:这样实现的好处是每个用户都可以同时访问服务端,不需要等待前一个结束之后才能使用。监听到一个客户端的时候,就产生一个新的线程,基于线程的并发特性,可以使客户端在每次遇到IO的时候都进行切换,并执行下一个线程的任务。
    

    TCP服务端实现单线程下实现并发

    # 服务端单线程实现并发
    '''
    服务端的工作:
    1.能同时接收每个客户端的请求,不需要一个用户停止,下一个用户才能使用
    2.24小时不间断提供服务
    3.实现并发
    '''
    
    

    TCP单线程实现并发

    # 在单线程下实现并发,使用的方式协程
    # TCP服务端使用线程实现并发
    '''
    服务端的工作:
    1.能同时接收每个客户端的请求,不需要一个用户停止,下一个用户才能使用
    2.24小时不间断提供服务
    3.实现并发
    '''
    
    # 服务端
    from gevent import monkey
    monkey.patch_all()  # 检测IO
    
    import socket
    import time
    from gevent import spawn
    
    server = socket.socket()
    
    server.bind(
        ('127.0.0.1', 9527)
    )
    
    server.listen(5)
    print('启动服务端...')
    
    
    # 线程任务,执行接收客户端消息与发送消息给客户端
    def working(conn):
        while True:
            try:
                data = conn.recv(1024).decode('utf-8')
                if len(data) == 0:
                    break
                print(data)
                # time.sleep(1)
                send_data = data.upper().encode('utf-8')
                conn.send(send_data)
    
            except Exception as e:
                print(e)
                break
    
        conn.close()
    
    
    def server2():
        while True:
            conn, addr = server.accept()
            spawn(working, conn)
    
    
    if __name__ == '__main__':
        s1 = spawn(server2)
        s1.join()
    
    
    # 客户端
    import socket
    from threading import Thread,
    current_thread
    
    def client():
        client = socket.socket()
        client.connect(
            ('127.0.0.1', 9527)
        )
        print('启动客户端...')
        number = 0
        while True:
            send_data = f'{current_thread().name} {number}'
            client.send(send_data.encode('utf-8'))
            data = client.recv(1024)
            print(data.decode('utf-8'))
            number += 1
    
            
    # 模拟了300个用户并发去访问服务端
    for i in range(300):
        t = Thread(target=client)
        t.start()
    
    
  • 相关阅读:
    【并发编程】并发编程随笔索引
    主题记录
    Java技术栈思维导图
    【ES 6.5.4 】ElasticSearch知识点
    Logstash Oracle同步设置
    【ES】【Reference 7.8 译】官方文档Mapping说明
    【ES】【Java High Level REST Client】官方索引和文档操作指导
    【ES】JAVA集成ES与基本操作及官方查询指导
    【实践】Effective Java实践总结
    【MyBatis】Spring集成MyBatis示例
  • 原文地址:https://www.cnblogs.com/whkzm/p/11742961.html
Copyright © 2011-2022 走看看