2009-10-31 30 views
9

Tôi đã viết một máy chủ bằng Python có nghĩa là gửi dữ liệu cho khách hàng dưới dạng "Tiêu đề: Thông báo"Làm thế nào để bạn tuôn ra ổ cắm Python?

Tôi muốn có thể gửi từng thư riêng lẻ để khách hàng sẽ cần thực hiện công việc tối thiểu để đọc "tiêu đề" và "thông báo"

Thật không may, tôi không thể tìm ra cách xả ổ cắm python đúng cách để khi có nhiều lần gửi liên tiếp, các tin nhắn được gộp lại với nhau trong bộ đệm ổ cắm và được gửi như một đoạn lớn.

Ví dụ:

Server gửi ...

socket.send ("header1:message1") 
socket.send ("header2:message2") 
socket.send ("header3:message3") 

Khách hàng nhận ... "header1: message1header2: message2header3: message3"

Tôi muốn nhận ba thông điệp cá nhân

header1:message1 
header2:message2 
header3:message3 

Tôi cần cách xả sau eac h gửi

+0

Sao chép chính xác: http://stackoverflow.com/questions/1097974/how-to-flush-a-socket-in-python – ChristopheD

+4

* Không trùng lặp : * Tiêu đề là * nghĩa đen * một bản sao, nhưng câu hỏi trên thực tế * có chức năng * khác nhau. OP cần câu trả lời giống như @ebo bên dưới. –

+1

Rất tiếc, điều đó có vẻ đúng. Sẽ cố gắng để được một chút chậm hơn thời gian tới ;-) – ChristopheD

Trả lời

19

Tôi đoán bạn đang nói qua kết nối TCP.

Cách tiếp cận của bạn không hoàn thiện. Một luồng TCP được định nghĩa là một luồng byte. Bạn luôn phải sử dụng một số loại phân cách và có thể không dựa vào ngăn xếp mạng để tách các thư của bạn.

Nếu bạn thực sự cần dịch vụ dựa trên datagram chuyển sang UDP. Bạn sẽ cần phải xử lý truyền lại chính mình trong trường hợp đó.

Để làm rõ:

Việc xóa bộ đệm gửi thường tạo ra các gói mới, giống như bạn mong đợi. Nếu khách hàng của bạn đọc các gói này đủ nhanh, bạn có thể nhận được một tin nhắn cho mỗi lần đọc.

Bây giờ hãy tưởng tượng bạn giao tiếp qua liên kết vệ tinh. Do băng thông và độ trễ cao, bộ định tuyến cuối cùng trước khi chờ đợi một thời gian ngắn cho đến khi đủ dữ liệu trong bộ đệm và gửi tất cả các gói của bạn cùng một lúc. Khách hàng của bạn bây giờ sẽ nhận được tất cả các gói không chậm trễ và sẽ đặt tất cả dữ liệu trong bộ đệm nhận cùng một lúc. Vì vậy, sự tách biệt của bạn đã biến mất một lần nữa.

+0

+1: Tôi sẽ thêm cho edumacations vì lợi ích đó, ngay cả khi @Jah là để tuôn ra các ổ cắm, khách hàng của ông vẫn sẽ nhận được các tin nhắn chính xác theo cùng một cách - đỏ bừng là về xóa bộ đệm trong tên giảm độ trễ và * không * phân tách thư. –

+0

Đã phát hiện một tình huống để cho biết điều này có thể sai. thx @ stu – ebo

+0

+1: TCP là một luồng. Thời gian của dữ liệu TCP được loại bỏ đặc biệt bởi định tuyến internet và giao thức TCP. Dữ liệu phải được đệm; "đỏ bừng" thực sự không có ý nghĩa gì nhiều. Tất cả điều đó có nghĩa là dữ liệu của bạn nằm ngoài bộ đệm của ứng dụng và vào bộ đệm giao thức TCP. –

0

Những gì bạn đang cố gắng làm, được chia dữ liệu thành "lô".

Ví dụ: bạn đang hoạt động trên "lô" bất cứ khi nào bạn đọc "dòng" khỏi tệp. Điều gì định nghĩa một "dòng"? Đó là một chuỗi các byte được chấm dứt bởi '\ n'. Một ví dụ khác là: bạn đọc 64KiB "khối" ra khỏi một tập tin. Điều gì định nghĩa một "chunk"? Bạn làm, kể từ khi bạn đọc 65536 byte mỗi lần. Bạn muốn có độ dài biến "chunk"? Bạn chỉ cần tiền tố "chunk" của bạn với kích thước của nó, sau đó đọc "chunk". Các tệp "aiff" (có triển khai cũng là tệp .wav và .avi của MS Windows) và các tệp "mov" được sắp xếp như vậy.

Ba phương pháp là phương pháp cơ bản nhất để tổ chức một dòng byte, bất kể phương tiện:

  1. kỷ lục tách
  2. hồ sơ kích thước cố định
  3. hồ sơ bắt đầu bằng kích thước của chúng.

Chúng có thể được trộn lẫn và/hoặc sửa đổi. Ví dụ: bạn có thể có "dấu phân tách bản ghi thay đổi", như trình đọc XML: đọc byte từ '<' trước tiên '' đầu tiên, thêm dấu gạch chéo sau '<' trước tiên và gọi nó là cuối dòng, đọc luồng cho đến cuối kỷ lục. Đó chỉ là một mô tả thô sơ.

Chọn phương pháp và triển khai phương thức đó trong cả trình ghi và trình đọc. Nếu bạn cũng ghi lại các lựa chọn của mình, bạn vừa xác định giao thức đầu tiên của mình.

3

chỉ thêm \ n sau mỗi tin nhắn ... như

socket.send ("header1: message1 \ n")

socket.send ("header2: message2 \ n")

socket.send ("header3: message3 \ n")

+1

Điều này làm việc cho tôi! –

+0

"\ n" không đảm bảo rằng các thư được tách riêng. – crey4fun

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