2011-12-08 23 views
5

Tôi có một chương trình Java liên tục được gửi dữ liệu UDP từ một hệ thống bên ngoài.Làm thế nào để "xóa" bộ đệm nhận trên một Java DatagramSocket?

Định kỳ, chúng tôi cần ngừng nhận dữ liệu (vì một máy khác đang xử lý dữ liệu đó). Trong suốt thời gian đó, đầu đọc ổ cắm của tôi đi vào vòng lặp ngủ. Khi đã đến lúc bắt đầu nhận gói, tôi lại chuyển sang socket.receive(Packet) và có bộ đệm chứa đầy các gói mà tôi nên không phải là đang xử lý. (Dữ liệu đến trong khi trong "thời gian dừng".)

Có cách nào để xóa bộ đệm của một DatagramSocket không?

Nếu không, lựa chọn thay thế tốt nhất là gì? Đặt kích thước bộ đệm là 0 khi tôi đi vào trạng thái chờ và mang nó trở lại khi tôi bắt đầu dịch vụ gói một lần nữa? Đóng ổ cắm khi tôi đợi và mở một cái mới khi tôi quay lại?

Trả lời

4

Thay vì có thời gian ngừng hoạt động trên socket, có thời gian chết trên bất kỳ mã nào xử lý các gói.

Vì vậy, ổ cắm tiếp tục nhận như bình thường, nhưng nếu thời gian ngừng hoạt động, nó sẽ ngay lập tức giảm gói.

Không chính xác giải pháp hiệu quả nhất, nhưng thực sự dễ thực hiện và có thể hữu ích vì nó để nút mở trong các trường hợp khác để chấp nhận các loại gói khác nhau vào các thời điểm khác nhau.

+0

Tôi thích nó. Máy cũng nhận được dữ liệu và ổ cắm IO thực tế là khá rẻ so với (nếu được thực hiện đúng :-). Tuy nhiên, có vẻ như điều này vẫn có thể dẫn đến điều kiện chủng tộc với "thời gian dừng" và "máy khác" trừ khi có thêm thông tin trong các gói để xác định ai sẽ xử lý chúng ... –

+0

@pst giả định các gói có một số loại xác định thông tin về họ, sau đó bất kỳ tín hiệu nào tắt nó sẽ có thể nói với nó "không chấp nhận gói sau id 1400000" hoặc cái gì đó. Điều này có thêm lợi thế là có 1399999 được xử lý ngay cả khi nó bị trễ và đạt đến các nút sau khi tín hiệu giết được tấn công. – corsiKa

+0

@pst Có, đó là điều kiện chủng tộc. May mắn thay, việc chuyển đổi xảy ra rất hiếm khi (nó là một phần của một cụm và được kích hoạt khi khóa chính bị hỏng và chúng ta cần phải đi đến bản sao lưu nóng). Có thể chấp nhận mất một chút dữ liệu trong thời gian đó (chính xác là không cần thiết, nhưng chúng tôi muốn giữ nó chính xác nhất có thể và chắc chắn không muốn đếm quá mức). –

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