在实现这个功能的过程中首先要理解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的用法描述清楚了,当然最主要的是会用,帮助我们在代码中去实现我们需要更高效的功能,减轻人力成本,帮助企业利润最大化。