2013-06-18 26 views
5

Tôi đang cố gắng để viết lại một trong những máy chủ cũ của chúng tôi sử dụng ZeroMQ, bây giờ tôi có các thiết lập sau Server, (mà làm việc cho các yêu cầu Zmq):Có thể sử dụng ZeroMQ để chấp nhận các yêu cầu socket truyền thống không?

using (var context = ZmqContext.Create()) 
    using (var server = context.CreateSocket(SocketType.REP)) { 
     server.Bind("tcp://x.x.x.x:5705"); 

     while (true) { ... } 

Đây là loại thiết lập hoạt động tốt nếu tôi sử dụng thư viện client Zmq để kết nối context.CreateSocket(SocketType.REQ)

Nhưng tiếc là chúng tôi đã có rất nhiều mã di sản mà cần phải kết nối với máy chủ này và các ổ cắm được tạo ra sử dụng libs ổ cắm .net:

Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    Socket.Connect(ipAddress, port); 

có một cách để viết một máy chủ ZeroMQ để chấp nhận các kết nối socket .net truyền thống này?

Trả lời

11

Bạn có thể đạt được điều này bằng ZMQ_STREAM sockets.

Xin lưu ý rằng kể từ zeroMQ 4.x, tùy chọn bộ định tuyến RAW has been deprecated cho loại socket ZMQ_STREAM mới, hoạt động giống như ROUTER + RAW.

Dường như nó chắc chắn sẽ phát triển.

Gần đây tôi đã thử các ổ cắm ZMQ_STREAM trong phiên bản 4.0.1.

Bạn có thể mở một tài khoản, sử dụng zmq_rcv cho đến khi bạn nhận được toàn bộ thư (bạn phải kiểm tra toàn bộ thư) hoặc zmq_msg_rcv để ZeroMQ xử lý. Bạn sẽ nhận được nhận dạng phần nhắn, giống như định danh bạn sẽ tìm thấy trong ROUTER ổ cắm, sau đó trực tiếp bởi một CHỈcơ thể phần. Không có dấu phân cách trống giữa chúng như có thể sử dụng một Ổ cắm REQ nói đến Ổ cắm ROUTER. Vì vậy, nếu bạn định tuyến chúng, hãy chắc chắn tự thêm nó.

Hãy coi chừng mặc dù: nếu có độ trễ ở đầu bên kia hoặc nếu thư của bạn vượt quá bộ đệm ZeroMQ ZMQ_STREAM (tên tôi dài 8192 byte), thông điệp của bạn có thể được giải thích bởi zeroMQ dưới dạng một chuỗi thư.

Trong trường hợp đó, bạn sẽ nhận được nhiều thông điệp ZeroMQ khác nhau bao gồm cả nhận dạng phần phần cơ thể, và nó là công việc của bạn để tổng hợp chúng, biết rằng nếu một số khách hàng đang nói chuyện với các ổ cắm STREAM , họ có thể bị lẫn lộn. Tôi sử dụng một bảng băm bằng cách sử dụng mã định danh nhị phân làm khóa và xóa mục nhập khỏi bảng khi tôi biết thông báo hoàn tất và được gửi đến nút tiếp theo.

Gửi qua ZMQ_STREAM với zmq_msg_send hoặc zmq_send hoạt động tốt như hiện tại.

3

Bạn có thể phải sử dụng loại socket RAW của zmq (thay vì REP) để kết nối và đọc dữ liệu khách hàng mà không có khung hình cụ thể zmq.

HTTP Server trong C (từ blog Pieter của)
http://hintjens.com/blog:42

RAW Ổ cắm thông tin loại
https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55

+0

Hey @Raffian, cảm ơn, nhưng không chắc chắn cách thực hiện điều này. Không có SocketType của RAW, bạn có ví dụ bạn có thể cung cấp không? –

+1

Vâng, đây là một trong những Pieter đã viết, http://hintjens.com/blog:42, về cơ bản nó là một máy chủ HTTP bằng cách sử dụng zmq nguyên ổ cắm, đó là trong C, nhưng bạn sẽ có thể cổng nó vào. Net, miễn là. net nó hỗ trợ socket 'RAW', tôi biết thư viện zmq Java thuần túy (jeromq) không ... hy vọng nó sẽ giúp. – raffian

+0

Cảm ơn @Raffian, tôi không thể liên kết trực tiếp với lib ZMQ, tôi đang sử dụng clrzmq, việc triển khai .Net nên điều này có thể không thực hiện được –

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