利用python实现socket网络对话---client,server

在实现这个功能的过程中首先要理解socket编程,就是如何通过网络将信息传递到网络的另一端,这就涉及到socket,实现网络对话的功能,让我一知半解的来写一个试试看,是不是真的能够实现发送信息到另一端,接收到你发送的话呢?

socket_server:

from gevent import socket, monkey
import gevent
monkey.patch_all()

def server(port):
    s = socket.socket()
    s.bind(('0.0.0.0',port))
    s.listen(500)
    while True:
        cli,addr = s.accept()
        print(addr)
        gevent.spawn(handler_request, cli)
        

def handler_request(conn):
    try:
        while True:
            data = conn.recv(1024)
            print('received data : %s' %data)
            conn.send(data)
            
            if not data:
                conn.shutdown(socket.SHUT_WR)
    except Exception as e:
        print(e)
    finally:
        conn.close()
if __name__== '__main__':
    server(8001)

这段代码中s.accept()的返回值有两个,第一个是链接对象,第二个是IP address,就算第二个不用也要写上,要不然会报错

'tuple' object has no attribute 'recv'错误,会误将第二个参数传进去,导致报错

这一段代码就是socket server端,实现启动socket服务,以便于client客户端来实现网络通信

接下来就是client客户端,功能的实现

socket_client:

import socket

HOST = 'localhost'
PORT = 8001
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
    msg = bytes(input('>>:'),encoding='utf8')
    s.send(msg)
    data = s.recv(1024)
    print('repsonse data: %s ' %data)
s.close()
    

客户端呢就相当于好多个用户在发送消息,在这里gevent就是实现了并发的功能,虽然在根本上还是同样的单线程处理,但是效果是并发的效果。接下来就是借用多线程调用来感受服务端的并发能力测试:

并发测试:

import socket
import threading
import time

def sock_conn():

    client = socket.socket()

    client.connect(("localhost",8001))
    count = 0
    # while True:
        #msg = input(">>:").strip()
        #if len(msg) == 0:continue
    client.send( ("hello %s" %count).encode("utf-8"))

    data = client.recv(1024)

    print("[%s]recv from server:" % threading.get_ident(),data.decode()) #结果
    count +=1
    client.close()
    time.sleep(1)


start_time = time.time()
ab = []
for i in range(10):
    t = threading.Thread(target=sock_conn)
    t.start()
    # t.join()
    ab.append(t)
    
for t in ab:
    t.join()

print(time.time()-start_time)

从多线程和单线程中完全可以感受出服务时间基本不变,由此可以看出socket_server实现了并发的效果。

到此为止就将基本协程中socket的用法描述清楚了,当然最主要的是会用,帮助我们在代码中去实现我们需要更高效的功能,减轻人力成本,帮助企业利润最大化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值