这是我的一个python写的socket程序
主要是改造python参考手册的 时间服务器,增加“线程”和“同步队列”,代码如下:
# -*- coding: utf-8 -*-
#############################################
## timeSvr.py
#############################################
u"""
一个时间服务器,
分别使用线程来处理【接收连接请求】和【发送服务器时间】
请求时间的客户socket放在【同步队列】中
"""
import socket
import time
import struct
import select
import threading
import Queue
PORT = 3000
CON_QUEUE_MAX_SIZE = 5
class CTimeServer:
u"""时间服务器"""
def __init__(self):
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind(("", PORT))
self.sock.listen(CON_QUEUE_MAX_SIZE)
print "TimeServer Start on [%s : %d]"%(socket.gethostbyname(socket.gethostname()), PORT)
except socket.error, e:
print e
#存放尚为处理(发送时间)的cliSock
cliSockQueue = Queue.Queue(maxsize = 10)
#“接收连接请求”线程
self.acceptThread = AcceptConnThread(self.sock, cliSockQueue)
#“发送服务器时间”线程
self.sendThread = SendThread(self.sock, cliSockQueue)
def Run(self):
#运行线程
self.acceptThread.start()
self.sendThread.start()
self.acceptThread.join()
self.sendThread.join()
self.sock.close()
class AcceptConnThread(threading.Thread):
u"""“接收连接请求”线程类"""
def __init__(self, svrSock, cliSockQueue):
threading.Thread.__init__(self)
self.svrSock = svrSock
self.cliSockQueue = cliSockQueue
def run(self):
while True:
self.AcceptConn()
def AcceptConn(self):
cliSock, (host, port) = self.svrSock.accept()
self.cliSockQueue.put(cliSock)
print "Query Time from [%s : %d]"%(host, port)
class SendThread(threading.Thread):
u"""“发送服务器时间”线程类"""
def __init__(self, svrSock, cliSockQueue):
threading.Thread.__init__(self)
self.svrSock = svrSock
self.cliSockQueue = cliSockQueue
def run(self):
while True:
cliSock = self.GetNextQueryCliSock()
t = int(time.time())
t = struct.pack("!I", t)
cliSock.send(t)
def GetNextQueryCliSock(self):
return self.cliSockQueue.get()
if __name__ == "__main__":
CTimeServer().Run()
# -*- coding: utf-8 -*- ############################################# ## timeCli.py ############################################# import socket import time import struct PORT = 37 try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect(("127.0.0.1", PORT)) t = sock.recv(4) t = struct.unpack("!I", t)[0] localT = int(time.time()) print localT - t t = time.ctime(t) print t finally: sock.close() except socket.error, e: print e