2013-02-02 20 views
5

Tôi đã xem qua số this blog post, mà tôi thấy tuyệt vời và khai sáng, cho biết cách tạo khung tin nhắn có độ dài cố định được gửi tới máy chủ socket Akka IO. Tôi đã làm việc với một thư viện mã nguồn mở tôi tìm thấy here called ScalaBuff, tạo ra một lớp mỏng đẹp trên đầu các đối tượng đệm giao thức.Thông báo bộ đệm giao thức qua Akka IO và Sockets

Sự cố tôi gặp phải là thích ứng với mã của tác giả blog (không thể tìm thấy liên kết để liên hệ trực tiếp với anh) để lấy độ dài (chuỗi 4 byte) và sau đó là mảng byte protobuf. Tôi có thể lo lắng về việc tìm ra thông điệp nào trên dây sau này, ngay bây giờ tôi chỉ muốn lấy mã để làm việc với một tin nhắn mẫu.

Vấn đề của tôi là tôi đang gặp sự cố khi chuyển đổi mã Akka IO từ việc kéo ByteStrings akka thành có thể gửi và kéo các byte thô từ thư protobuf. Đây là một triệu chứng của sự thiếu hiểu biết của tôi với các máy chủ socket sử dụng Akka IO. Tôi có thể nhận được và từ biểu diễn byte của đối tượng protobuf của tôi (một Zombie Sighting), nhưng tôi không thể lấy mẫu từ blog để làm việc trên mảng byte thay vì chuỗi.

Nếu có ai đó có một số lời khuyên, một số mã mẫu hoặc một số đầu vào về cách lấy điểm A (bài đăng blog được đề cập ở trên) đến điểm B (máy khách socket Akka IO gửi thông báo protobuf tới ổ cắm Akka IO máy chủ .. Tôi nghĩ rằng tôi có khách hàng làm việc .. có thể), đó sẽ là tuyệt vời.

+0

Hóa ra vấn đề của tôi không liên quan gì đến Akka IO hoặc thậm chí là Scala. Khi tôi đã gửi, tôi đã gửi những gì lên đến một đại diện "toString" của mảng byte protobuf chứ không phải là mảng byte thực tế được chuyển đổi đúng thành chuỗi. –

Trả lời

0

Hãy thử điều này:

val myByteArray = myByteString.toArray // converts to an Array[Byte] 
val myMessage = MyMessage.defaultInstance.mergeFrom(myByteArray) 

MyMessage là lớp ScalaBuff-trình biên dịch tạo ra các mẫu thiết lập MyMessage.proto của bạn. Lưu ý rằng thư viện protobuf của Google có một lớp ByteString riêng biệt, hãy chắc chắn rằng bạn không kết hợp cả hai.

CẬP NHẬT: Vấn đề của Kevin đã được giải quyết, về cơ bản vấn đề là anh ta đang sử dụng phương thức toString của một mảng [Byte] thay vì gói mảng byte trong một String() mới, chuyển đổi một cách chính xác mảng byte thành Chuỗi, được sử dụng trong cuộc gọi .format "% s".

+0

Tôi đã thấy và sử dụng mã toArray và mergeFrom trước đây. Vấn đề của tôi là tôi không biết làm thế nào để dải các công cụ khung byte từ mẫu mã trong blog đó. Tôi không thể biết làm thế nào để biết khi nào một tin nhắn dừng lại và người kia bắt đầu nếu tôi chỉ đọc từ một dòng ổ cắm ... Bất kỳ cơ hội nào bạn có thể chỉ cho tôi những gì nó trông giống như đọc và viết các mảng trên ổ cắm Akka IO? –

+0

Bạn đã thử sử dụng phương thức 'mergeDelimitedFrom (InputStream)' và 'writeDelimitedTo (OutputStream)' chưa? Phương thức 'writeDelimitedTo' về cơ bản thêm một dấu phân cách giữa các thông điệp để phương thức' mergeDelimitedFrom' biết khi nào đọc chúng đúng cách. –

+0

Có thể [hướng dẫn về Akka IO] (http://doc.akka.io/docs/akka/2.0/scala/io.html) sẽ giúp bạn? Ngoài ra, hãy thử truy cập #scala hoặC#akka trên kênh IRC Freenode. Đáng buồn thay, tôi không có nhiều kinh nghiệm Akka 2.0 IO bản thân mình. –

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