2013-08-03 69 views
0

iv創建了一個簡單的異步客戶端和服務器,但無法讓客戶端在第一次接收後進行回覆。看來服務器從客戶端,但客戶端傾斜接收後可以發回的答覆:如何讓我的龍捲風ioloop套接字客戶端在接收後發送回阻塞?

這裏是客戶端的會話:

[[email protected] Public]$ python cl.py 
buf got your stuff 
dded callback   ## this is a log addded to see if execution got where i wanted 

,這裏是服務器的日誌:

[[email protected] Public]$ python that.py 
buf ehlo localhost 

我期待着某種形式的乒乓球效果,其中一個發送另一個然後沖洗泡沫重複。

這裏是客戶端的代碼:

import socket 
import fcntl, os, io, time, functools 
from tornado import ioloop 


class Punk(object): 
    def __init__(self): 
     self.loop = ioloop.IOLoop.instance() 
     self.address = 'blah.sock' 
     self.authkey = "none" 
     self.sock = socket.socket(socket.AF_UNIX) 
    def setup(self): 

     self.sock.connect(self.address) 
     fcntl.fcntl(self.sock, fcntl.F_SETFL, os.O_NONBLOCK) 
     self.sock.sendall("ehlo localhost") 
     self.fd = self.sock.fileno() 
     self.loop.add_handler(self.fd,self.reader,self.loop.READ) 
     self.loop.start() 

    def reader(self,fd,event): 
     result = b"" 
     if event == self.loop.READ: 

      try: 
       while True: 
        servrep = self.sock.recv(1024) 
        if not servrep: 
         break 
        result += servrep 
        self.prnt(result) 
        break 
      except Exception as e: 
       print "this %s happend"%e 
     return 

    def prnt(self,buf): 
     print "buf %s"%buf 
     tim = time.time() + 2 
     self.loop.instance().add_timeout(tim, self.reply) 
     #callbac = functools.partial(self.loop.add_timeout,tim,self.reply) 
     #self.loop.add_callback(self.reply) ### i tried this too 
     print "added callback" 


    def reply(self): 
     self.sock.sendall(" clent got your stuff") 

if __name__ == "__main__": 
    bob = Punk() 
    bob.setup() 

這裏是服務器:

import socket 
import fcntl, os, io, time, functools 
from array import array 
from tornado import ioloop 


class Player(object): 
    def __init__(self): 
     self.loop = ioloop.IOLoop.instance() 
     self.address = 'blah.sock' 
     self.authkey = "none" 
     self.sock = socket.socket(socket.AF_UNIX) 
    def setup(self): 
     self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) 
     self.sock.bind(self.address) 
     fcntl.fcntl(self.sock, fcntl.F_SETFL, os.O_NONBLOCK) 
     self.sock.listen(1) 
     self.fd = self.sock.fileno() 
     self.loop.add_handler(self.fd,self.reader,self.loop.READ) 
     self.loop.start() 

    def reader(self,fd,event): 
     result = b"" 
     if event == self.loop.READ: 
      self.conn, self.addr = self.sock.accept() 
      try: 
       while True: 
        maxrep = self.conn.recv(1024) 
        if not maxrep: 
         break 
        result += maxrep 
        self.prnt(result) 
        break 
      except Exception as e: 
       print "this %s happend"%e 
     return 

    def prnt(self,buf): 
     print "buf %s"%buf 
     tim = time.time() + 2 
     self.loop.instance().add_timeout(tim, self.reply) 
     #callbac = functools.partial(self.loop.add_timeout,tim,self.reply) 
     #self.loop.add_callback(callbac) 


    def reply(self): 
     self.conn.sendall("got your stuff") 

if __name__ == "__main__": 
    bob = Player() 
    bob.setup() 

回答

0

我已經把我的套接字不成塊的模式,而是從 接受的時候我沒趕上一個錯誤當沒有連接時爲非塊狀態: here:

def reader(self,fd,event): 
    result = b"" 
    if event == self.loop.READ: 
     self.conn, self.addr = self.sock.accept() 

應該是

def reader(self,fd,event): 
    result = b"" 
    if event == self.loop.READ: 
     try: 
      self.conn, self.addr = self.sock.accept() # we get stuck here 
      self.connl.append(self.conn) 
     except Exception as e: 
      pass 
相關問題