Có là một cách khác nhau để xử lý vấn đề này; cái mà bạn sẽ chọn phụ thuộc vào số lượng công việc bạn muốn làm. *
Nhưng trước tiên, bạn nên làm rõ (cho chính mình) cho dù bạn đang giao dịch với UDP hoặc TCP; không có "ngăn xếp TCP cơ bản" cho các ổ cắm UDP. Ngoài ra, UDP là giao thức sai để sử dụng để gửi toàn bộ dữ liệu như văn bản hoặc ảnh; nó là một giao thức không đáng tin cậy, do đó bạn không được đảm bảo nhận mọi gói, trừ khi bạn đang sử dụng thư viện socket được quản lý (chẳng hạn như ENet).
Lua51/LuaJIT + LuaSocket
Bỏ phiếu là phương pháp duy nhất.
- Chặn: gọi
socket.select
không có đối số thời gian và chờ ổ cắm có thể đọc được.
- Không chặn: gọi
socket.select
với đối số hết giờ là 0
và sử dụng sock:settimeout(0)
trên ổ cắm bạn đang đọc.
Sau đó, chỉ cần gọi những liên tục này. Tôi khuyên bạn nên sử dụng coroutine scheduler cho phiên bản không chặn, để cho phép các phần khác của chương trình tiếp tục thực thi mà không gây ra quá nhiều sự chậm trễ.
Lua51/LuaJIT + LuaSocket + Lua Lanes (Recommended)
Tương tự như phương pháp trên, nhưng các ổ cắm tồn tại trong một làn đường (trạng thái Lua nhẹ trong chủ đề khác) đã sử dụng Lua Lanes (latest source). Điều này cho phép bạn ngay lập tức đọc dữ liệu từ ổ cắm và vào bộ đệm. Sau đó, bạn sử dụng linda để gửi dữ liệu đến chuỗi chính để xử lý.
Đây có lẽ là giải pháp tốt nhất cho vấn đề của bạn.
Tôi đã tạo một ví dụ đơn giản về điều này, có sẵn here. Nó dựa vào Lua Lanes 3.4.0 (GitHub repo) và một LuaSocket vá 2.0.2 (source, patch, blog post re' patch)
Kết quả là đầy hứa hẹn, mặc dù bạn chắc chắn nên refactor code ví dụ của tôi nếu bạn lấy được từ nó.
LuaJIT + hệ điều hành cụ socket
Nếu bạn là một chút bạo dâm, bạn có thể thử thực hiện một thư viện socket từ đầu. LuaJIT 's FFI library làm cho điều này có thể từ Lua thuần túy. Lua Lanes sẽ hữu ích cho việc này.
Đối với Windows, tôi khuyên bạn nên xem William Adam's blog. Anh ấy đã có một số cuộc phiêu lưu rất thú vị với sự phát triển LuaJIT và Windows. Đối với Linux và phần còn lại, hãy xem hướng dẫn cho C hoặc nguồn của LuaSocket và dịch chúng sang các hoạt động LuaJIT FFI.
(LuaJIT hỗ trợ callbacks nếu API đòi hỏi nó, tuy nhiên, có một chi phí hiệu suất signficant so với bỏ phiếu từ Lua tới C.)
LuaJIT + eNet
ENet là một thư viện tuyệt vời. Nó cung cấp sự kết hợp hoàn hảo giữa TCP và UDP: đáng tin cậy khi mong muốn, không đáng tin cậy nếu không. Nó cũng tóm tắt các chi tiết cụ thể của hệ điều hành, giống như LuaSocket. Bạn có thể sử dụng API Lua để liên kết nó hoặc truy cập trực tiếp qua FFI của LuaJIT (được khuyến nghị).
* Pun không chủ ý.
Tôi nhận ra Lua thực sự là hệ thống chuỗi đơn lẻ với sự kiện hệ thống sử dụng gọi lại. Tôi đã chỉ hy vọng chúng tôi sẽ nhận được một cuộc gọi trở lại khi có dữ liệu có sẵn thay vì tiếp tục nhìn vào nó. – user4749
Bạn vẫn phải chuyển quyền kiểm soát cho bất kỳ người nào đang thực hiện cuộc gọi lại để nhận cuộc gọi lại. Vì vậy, bất cứ khi nào bạn đã làm điều đó, chỉ cần kiểm tra xem liệu dữ liệu có ở đó không. –
Tôi không đồng ý nhiều. Sử dụng lua-ev hoặc một sự kiện khác KHÔNG áp đặt bỏ phiếu!Sử dụng Lua + "Một số vòng lặp sự kiện" được sử dụng rất hiệu quả trong các thiết bị nhúng (trong đó node.js là lớn) cho các tác vụ nghiêm trọng với hiệu suất rất tốt và dấu chân mem thấp. Đối với một số trường hợp, đây là một trận đấu hoàn hảo. Có các mô đun xung quanh giúp dễ dàng làm việc với hệ điều hành ở mức rất thấp (https://github.com/justincormack/ljsyscall). – lipp