2

I'm relatively new to C# but here goes:

I am developing a remote file service client/server console application in C# which is supposed to exchange messages using synchronous sockets.

One of the main problems (even thought it might seem simple) is to return a string from the server, to the client using streamreader/streamwriter.

The application user a command line interface with options (from a switch statement) to execute actions. I.e. typing 1 and enter would execute the code to send the string from the server to the client.

Below is a sample code from the client:

        try
        {
            using (TcpClient client = (TcpClient)clientObject)
            using (NetworkStream stream = client.GetStream())
            using (StreamReader rd = new StreamReader(stream))
            using (StreamWriter wr = new StreamWriter(stream))
            {

                string menuOption = rd.ReadLine();


                switch (menuOption)
                    {
                        case "1":
                        case "one":
                            string passToClient = "Test Message!";
                            wr.WriteLine(passToClient);
                            break;
                   } 
                      while (menuOption != "4");
               }
         }

I understand the code I posted is just a snippet of the program, but it would take up a fair amount of space and was hoping you can gather what I mean from this, if not I will post more.

This is just to give a general idea of what I am going for,

I appreciate any help / advice you can give. Its not so much code examples I'm looking for (although a little would help) but more some explanation on streamreader/writer as I cant seem to understand much of what is online.

Thanks.

0

4 Answers 4

5

Whenever you use StreamWriter you need to Flush() the contents of the stream. I'll quote MSDN as the reason becomes quite clear:

Clears all buffers for the current writer and causes any buffered data to be written to the underlying stream.

You can call it quite simply like:

wr.flush();
Sign up to request clarification or add additional context in comments.

Comments

4

I think you're just missing a wr.flush(); but this article should cover everything you need:

http://thuruinhttp.wordpress.com/2012/01/07/simple-clientserver-in-c/

1 Comment

Ah, I missed Flush().
4

Solution can be simpler:

StreamWriter wr = new StreamWriter(stream) { AutoFlush = true }

Comments

0

I just ran a test using your code, and it works fine, I can step right into the "one" case statement.

I am guessing you are either not including the line-break in the string you are sending, or you just have the TcpClient or TcpListener configured wrong.

Here is the Client-Side code for my test:

        TcpClient client = new TcpClient("127.0.0.1", 13579);
        string message = "one" + Environment.NewLine;
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
        NetworkStream stream = client.GetStream();
        stream.Write(data, 0, data.Length);

Here is the Server-Side:

        IPAddress localAddr = IPAddress.Parse("127.0.0.1");
        TcpListener server = new TcpListener(localAddr, 13579);
        server.Start();

        TcpClient client = server.AcceptTcpClient();
        using (client)
        using (NetworkStream stream = client.GetStream())
        using (StreamReader rd = new StreamReader(stream))
        using (StreamWriter wr = new StreamWriter(stream))
        {
            string menuOption = rd.ReadLine();
            switch (menuOption)
            {
                case "1":
                case "one":
                    string passToClient = "Test Message!";
                    wr.WriteLine(passToClient);
                    break;
            }
            while (menuOption != "4") ;
        }

Just run the server-side code first, which will block while waiting for connection and then while waiting for data. Then run the client-side code. You should be able to catch a breakpoint on the switch().

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.