So as I mentioned in my previous post, there is more than one way to communicate through sockets. Below I have show 3 different, though similar ways to make use of sockets. This is far from exhaustive and please note that this is for demonstration purposes only and as is, should not be used in production code of any kind. They're missing error checking, stream verification, etc.
I am interested if any one has any comments or feedback as to use cases where they would choose to use one of the particular methods over another. Everything below is fairly procedural and could probably be implemented much cleaner as Objects, but as mentioned this is purely a test case using the EchoServer I wrote a couple posts back.
#import("dart:io"); void main() { sockets_with_handlers(); sockets_with_direct_streams(); sockets_with_socket_streams(); } void sockets_with_handlers() { Socket usingHandlers = new Socket("127.0.0.1", 5700); String test = "SocketHandlers Test String\n"; // Called when we successfully connect usingHandlers.connectHandler = () { print("Handers: Connected"); }; // Called when we can write to the socket. usingHandlers.writeHandler = () { usingHandlers.writeList(test.charCodes(), 0, test.length); print("Handers Sent: $test"); }; // Called when we receive from the socket. usingHandlers.dataHandler = () { int availBytes = usingHandlers.available(); Listbuff = new List (availBytes); usingHandlers.readList(buff, 0, availBytes); print("Handers Received: ${new String.fromCharCodes(buff)}"); }; // Called when the input stream from socket is closed. usingHandlers.closeHandler = () { print("Handers: End of stream. Closing connection"); usingHandlers.close(); }; } void sockets_with_direct_streams() { Socket usingStreams = new Socket("127.0.0.1", 5700); String test = "Direct Socket Streams test string\n"; // To be 'pure' without the handlers we assume connection is successful. // NOTE: Not recommended! print("Direct Streams: Connected"); // Wrap the input stream in StringInputStream so we can // make use of the convenience functions. StringInputStream inStream = new StringInputStream(usingStreams.inputStream); OutputStream outStream = usingStreams.outputStream; // Write to our stream outStream.write(test.charCodes()); print("Direct Streams Sent: $test"); // Use our handle wrapper to read lines // Saves us from using dataHandler directly inStream.lineHandler = () { String input = inStream.readLine(); print("Direct Streams Received: $input"); }; // All bytes have been read and input stream is closed. inStream.closeHandler = () { print("Direct Streams: End of stream. Closing connection"); usingStreams.close(); }; } void sockets_with_socket_streams() { Socket usingSocketStreams = new Socket("127.0.0.1", 5700); String test = "Socket In/Out Streams test string\n"; // To be 'pure' without the handlers we assume connection is successful. // NOTE: Not recommended! print("Socket Streams: Connected"); SocketInputStream inStream = new SocketInputStream(usingSocketStreams); SocketOutputStream outStream = new SocketOutputStream(usingSocketStreams); // Write to our stream. outStream.write(test.charCodes()); print("Socket Streams Sent: $test"); // Called when new data arrives in our SocketInputStream inStream.dataHandler = () { List buff = inStream.read(); print("Socket Streams received: ${new String.fromCharCodes(buff)}"); }; // Input stream has been closed. Make sure output stream // and socket itself are also closed. inStream.closeHandler = () { print("Socket Streams: End of stream. Closing connection"); outStream.close(); usingSocketStreams.close(); }; }
Direct Streams: Connected Direct Streams Sent: Direct Socket Streams test string Socket Streams: Connected Socket Streams Sent: Socket In/Out Streams test string Handers: Connected Handers Sent: SocketHandlers Test String Direct Streams Received: DIRECT SOCKET STREAMS TEST STRING Socket Streams received: SOCKET IN/OUT STREAMS TEST STRING Handers Received: SOCKETHANDLERS TEST STRING Direct Streams: End of stream. Closing connection Socket Streams: End of stream. Closing connection Handers: End of stream. Closing connection
One of the first things you'll notice with the output is that due to the non-blocking nature of the callbacks, some of the calls happened in near-parallel. In the sockets_with_socket_streams function, while I didn't specifically make use of it, we could have also wrapped the SocketInputStream with a StringInputStream as well, similar to what we did in the sockets_with_direct_streams function.
No comments:
Post a Comment