linux socket函数参数_linux socket函数详解_socket()函数(7)
$ ./echoclient2.py localhost "Hello world" 7
Received: Hello world [0]
Received: Hello world [1]
Received: Hello world [5]
...
Received: Hello world [16]
37.07 seconds
与前面的多线程客户机一样,线程不一定以它们被启动的顺序连接。然而最值得注意的是,为20个线程提供服务所花的时间基本上是在通过socket逐个地写出字节时引入的所有延时之和,37秒多。这里服务器没有什么是并行化的,因为我们需要等待每个单独的socket连接完成其任务。
下面是异步服务器,使用select()来多路复用socket。看它如何避免我们刚才客户机引入的那种延时(或者由于确实很慢的连接而频繁产生的那种延时)。
#!/usr/bin/env python
from socket import *
import sys, time
from select import select
if __name__=='__main__':
while 1:
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(('',int(sys.argv[1])))
print "Ready..."
data = {}
sock.listen(20)
# 等待20个客户连接
for _ in range(20):
newsock, client_addr = sock.accept()
print "Client connected:", client_addr
data[newsock] = ""
# 上一次有活动socket的时刻
last_activity = time.time()
while 1:
# 多路复用方式监控20个socket连接,TCP连接是双工的,可读可写
# 因此可读socket集合与可写socket集合相同
read, write, err = select(data.keys(), data.keys(), [])
# 若超过5秒还没有活动的socket,则彻底关闭所有连接
if time.time() - last_activity > 5:
for s in read: s.shutdown(2)
break
for s in read:
data[s] = s.recv(32)
for s in write:
if data[s]:
last_activity = time.time()
s.send(data[s])
data[s] = ""
我们的异步服务器先通过accept接收所有的20个连接请求,然后在主循环中通过多路复用方式不间断地监控这20个连接。当select()返回时,可读连接列表将被修改,指示某个连接已经准备被读取。读取其中各个连接中数据,然后写回去。如果超过5秒还没有活跃的连接,则释放所有连接。
这个服务器比较简单,因为它是在等待准确的20个客户机连接之后再用select()去监控。但是它仍然说明了使用密集的轮训循环,以及仅当数据在特定的socket上可用时才读/写数据的的基本概念。select()的返回值分别是可读、可写和错误的socket列表的三元组。这其中的每一种类型都是根据需要在循环中处理的。
顺便说一句,使用这种异步服务器允许“慢速连接”客户机在大约6秒的时间内完成全部20个连接,而不是需要37秒(至少在我的测试系统上是这样)。
“现在的程序编写朝着越来越冗长庞大的方向发展,而c语言虽然属于相对‘低级’的编程语言,但它的简洁之美是无可替代的。然而定义枚举类型的方式却不太简洁,要依如下语法编写:。像前文所说lua语法简洁优美,解释器由标准c编写。
6、结束语
本教程中介绍的服务器和客户机很简单,但是它们展示了用C和Python编写Socket应用程序所必需的每一方面。更高级的客户机或服务器本质上不过是来回地传输更有趣的数据;socket层的代码和本文中的这些例子并没有什么不同。
执行线程化、分支和异步socket处理的一般要点可类似地应用于更高级的服务器。您的服务器和客户机本身可能会做更多的事情,但是针对可扩展性的策略始终是这三种方法之一(或者它们的组合)。
参考文献:
Linux Socket编程(不限Linux):
Linux socket 编程,第一部分:
Linux socket 编程,第二部分:
http://www.jiaoanw.com/%E6%95%99%E6%A1%88%E6%A8%A1%E6%9D%BF/article-45996-7.html
http://www.jiaoanw.com/
true
教案网
http://www.jiaoanw.com/%E6%95%99%E6%A1%88%E6%A8%A1%E6%9D%BF/article-45996-7.html
report
2500
$ ./echoclient2.py localhost "Hello world" 7Received: Hello world [0]Received: Hello world [1]Received: Hello world [5]...Received: Hello world [16]37.07 seconds 与前面的多线程客户机一样,线