As for the Elm Architecture, please see this example:
https://gist.github.com/mgold/c7832f9197ff3e931152
As for subscribing and unsubscribing, it's a bit trickier. The library was really designed for the case where you want a constant connection to the server and all (or most) messages are relevant. If you're interfacing with an existing Socket.io service that uses rooms and complex subscription (which is inherently mutable), you might be out of luck, or at best, need some JS code to pass the cleaned up messages into Elm.
On the other hand, if you're writing the server too, just come up with a JSON format for messages that you can deserialize in Elm that contains information on chatrooms, etc. As a rough sketch:
type alias Model = { rooms : List String, ... }
type alias Message = {room : String, text : String, senderID: Int, ...}
type alias Action = Received Message | ...
update action model =
case action of
Received {room, text} -> if not (List.member room model.rooms) then model else ...
Hope that helps.