0

I used this sample from Microsoft here https://msdn.microsoft.com/en-us/windows/uwp/networking/sockets to send data from one to another and it worked. However how can I send a byte[] or a stream (say an image or a video) using sockets ?

Server:

private async void btnConnect_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                StreamSocketListener socketListener = new StreamSocketListener();

                socketListener.ConnectionReceived += SocketListener_ConnectionReceived;

                Windows.Networking.HostName host = new Windows.Networking.HostName("192.168.1.4");
                await socketListener.BindEndpointAsync(host, 8887.ToString());
            }
            catch (Exception ex)
            {
                //Handle exception.
            }

        }

private async void SocketListener_ConnectionReceived(StreamSocketListener sender,
     StreamSocketListenerConnectionReceivedEventArgs args)
        {

            Stream inStream = args.Socket.InputStream.AsStreamForRead();
            StreamReader reader = new StreamReader(inStream);
            string request = await reader.ReadLineAsync();

            Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
            StreamWriter writer = new StreamWriter(outStream);
            await writer.WriteLineAsync(request);
            await writer.FlushAsync();
        }

Client:

private async void btnSend_Click(object sender, RoutedEventArgs e)
{
try
{

    Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();

    Windows.Networking.HostName serverHost = new Windows.Networking.HostName("192.168.1.4");

    string serverPort = "8887";
    await socket.ConnectAsync(serverHost, serverPort);

    Stream streamOut = socket.OutputStream.AsStreamForWrite();
    StreamWriter writer = new StreamWriter(streamOut);
    string request = "test";
    await writer.WriteLineAsync(request);
    await writer.FlushAsync();

    //Read data from the echo server.
    Stream streamIn = socket.InputStream.AsStreamForRead();
    StreamReader reader = new StreamReader(streamIn);
    string response = await reader.ReadLineAsync();
}
catch (Exception ex)
{
    //Handle exception here.            
}
}
user3159792
  • 384
  • 1
  • 6
  • 26

1 Answers1

4

Use the Stream's Write method that allows you to pass in a byte array.

streamOut.Write(myByteArray, 0, myByteArray.Length);

StreamWriter is more of a helper. You don't need a StreamReader or StreamWriter to read/write to a Stream. They are helpful, but actually don't do what you want to do.

Now keep in mind that you may not want to send a large amount through at once. In that case you would loop until you have finished sending it all. See this question for reference: sending a large amount of data throught TCP socket

Community
  • 1
  • 1
TyCobb
  • 8,909
  • 1
  • 33
  • 53