我的第一个socket程序 “时间服务器”

这是我的一个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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值