2010-09-01 26 views
5

Có cách nào để buộc self.transport.write (phản hồi) viết ngay lập tức cho kết nối của nó sao cho lệnh gọi tiếp theo tới self.transport.write (response) không được đệm vào cùng một cuộc gọi.Vận chuyển xoắn.write

Chúng tôi có một khách hàng với phần mềm kế thừa mà chúng tôi không thể sửa đổi, đọc cho yêu cầu thứ nhất và sau đó bắt đầu đọc lại, và vấn đề tôi có được xoắn tham gia vào hai viết với nhau mà phá vỡ khách hàng bất kỳ ý tưởng tôi đã cố gắng nhìn vào deferreds nhưng tôi không nghĩ rằng nó sẽ giúp đỡ trong trường hợp này

Ví dụ:

self.transport.write("|123|") # amount of messages to follow 
a loop to generate next message 
self.transport.write("|message 1 text here|") 

dự kiến:

|123| 
|message 1 text here| 

Kết quả:

|123||message 1 text here| 
+0

Xin chào, tôi biết đây là một bài đăng cũ nhưng bạn có thể cho tôi biết bạn đã làm gì để giải quyết vấn đề này? –

+0

Đối với những gì nó có giá trị, nó không thể làm cho công việc này hoàn toàn đáng tin cậy. Một ngày bạn có thể mua một số phần mềm chuyển mạch hoặc định tuyến khác và ứng dụng của bạn sẽ bị hỏng. Câu hỏi thường gặp về xoắn này cố gắng giải thích: http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#Whyisprotocol.dataReceivedcalledwithonlypartofthedataIcalledtransport.writewith – Glyph

Trả lời

-1

Đặt độ trễ tương đối lớn (10 giây) giữa các lần ghi. Đây sẽ là giải pháp duy nhất có thể. Bởi vì nếu người nhận bị viết rất tệ bởi những người không biết TCP là gì và cách sử dụng nó, bạn hầu như không thể làm bất cứ điều gì (ngoài việc viết lại ứng dụng đó).

+0

Cảm ơn bạn đã bình luận, thật đáng buồn vẫn là vấn đề tương tự. Nó xuất hiện chờ đợi cho đến khi tất cả xử lý được hoàn thành ngay cả với một time.sleep (60) trước khi gửi lưu lượng truy cập xuống dòng. Tôi sẽ phải xem xét một số thực hiện khác để có được điều này để làm việc: ( – Jarratt

+9

Lò phản ứng đợi cho đến khi bạn để cho nó chạy để làm bất cứ điều gì. Nếu bạn không để cho nó chạy, nó không thể làm bất cứ điều gì. (60) ngăn không cho nó chạy Nếu bạn muốn làm điều gì khác sau 60 giây, hãy sử dụng 'reactor.callLater (60, somethingElse)' –

0

Bạn có thể cho biết bạn đang sử dụng phương tiện nào. Đối với hầu hết các trường, Đây là phương pháp điển hình:

def write(self, data): 
     if data: 
      if self.writeInProgress: 
       self.outQueue.append(data) 
      else: 
       .... 

Dựa vào các chi tiết hành vi của các chức năng ghi có thể được thay đổi để làm như mong muốn.

+0

Hiện tại tôi đang sử dụng Twisted SSL để tạo một máy chủ bảo mật – Jarratt

2

Tôi gặp sự cố liên quan đến phần nào khi sử dụng cấp độ xuống Python 2.6. Máy chủ mà tôi đang nói đến đang mong đợi một ký tự ACK duy nhất và THEN là bộ đệm dữ liệu riêng biệt và tất cả chúng đều xuất hiện cùng một lúc. Trên đầu trang của điều này, nó là một kết nối TLS. Tuy nhiên, nếu bạn tham khảo các ổ cắm TRỰC TIẾP, bạn có thể gọi một sendall () như:

self.transport.write(Global.ACK) 

tới:

self.transport.getHandle().sendall(Global.ACK) 

... và nên hoạt động. Điều này không có vẻ là vấn đề với Python 2.7 với Twisted on X86, chỉ cần Python 2.6 trên bộ xử lý ARM SHEEVAPlug.

Các vấn đề liên quan