代码块分享

需要经常练习的代码

使用套接字进行

# 使用套接字实现多用户连接服务端实现通信

# 服务端
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()

posted @ 2019-10-26 13:58  余人。  阅读(174)  评论(0编辑  收藏  举报