2014-04-07 16 views
7

Tôi đã viết một ứng dụng khách và máy chủ bằng cách sử dụng akka.io.tcp và tôi gặp sự cố khi đọc thư được khách hàng gửi. Tôi đã sử dụng json để gửi tin nhắn. Ở phía khách hàng, tôi viết thông điệp theo cách này:Akka IO.TCP với Json

connection ! Write(ByteString(msgString)) 

Ở phía máy chủ tôi đã điều sau đây:

override def receive: Receive = { 
    case Received(data) => listener ! Json.parse(data.utf8String) 
    case PeerClosed => { 
    context stop self 
    } 
} 

Vấn đề là AKKA được đọc nhiều hơn một thông điệp cùng một lúc, vì vậy tôi nhận được một Json không hợp lệ. Có cách nào để làm cho akka chỉ đọc một tin nhắn cùng một lúc không?

+4

Tôi có thể sai ở đây, nhưng tôi tin rằng một phần sẽ là về bạn. Bạn sẽ phải viết logic biết khi nào một yêu cầu kết thúc và một yêu cầu khác bắt đầu và xử lý việc giữ các yêu cầu không đầy đủ và ghép nối chúng với phần còn lại của chúng khi nó đến. Tôi tin vào thuật ngữ Netty, đây sẽ là FrameDelimiter trong đường dẫn , nhưng tôi không tin rằng có một tính năng tương tự hiện tại trong Akka Tcp cho điều này (mặc dù tôi có thể sai). – cmbaxter

Trả lời

6

Mô-đun TCP của Akka (và được thiết kế là) rất "mức thấp", vì vậy chúng tôi không cung cấp bất kỳ loại dấu phân cách khung nào. Bạn nên xử lý nó giống như một khối xây dựng cấp TCP, sau đó bạn phải xây dựng công cụ của bạn trên.

Trong ví dụ của bạn, diễn viên sẽ phải tổng hợp các khối dữ liệu đến và phát hiện khi tài liệu json được "hoàn thành", sau đó kích hoạt tính năng unmarshalling.

Ý tưởng cung cấp thứ gì đó trong hộp này khá hấp dẫn ... Tôi sẽ hỏi các bạn về kế hoạch của chúng tôi để hỗ trợ các loại trường hợp sử dụng này.

Tuy nhiên, tôi hy vọng điều này sẽ hữu ích!

+1

ok. bây giờ tôi có một nghi ngờ khác: Tôi nhận được nhiều hơn một tin nhắn tại một thời điểm. có thể nhận được một nửa tin nhắn chẳng hạn? – Augusto

+1

Vâng, như đã nói ở trên, mã Tkp của Akka không có ý tưởng về các dấu phân cách khung và do đó gửi bất cứ thứ gì nó có bất kể nếu bạn là một đoạn dữ liệu đầy đủ hay không. Bạn cần phải tự mình ghép tất cả những thứ này lại với nhau. – cmbaxter

+0

Những gì bạn có thể làm để giải quyết điều này là tổng hợp tất cả các khối, sau đó trên mỗi lần nhận, hãy thử kiểm tra xem tài liệu JSON đang ở đâu (nếu nó kết thúc) và sau đó trích xuất phần đó từ "chuỗi tổng hợp" của bạn. .parse' nó. Hoặc bạn có thể giới thiệu một diễn viên khác sẽ thực hiện việc tách và gửi các chuỗi json _full_ đến "diễn viên phân tích cú pháp" ... Chỉ cần một số ý tưởng :-) –