问题
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.
回答1:
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/
回答2:
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();
回答3:
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().
来源:https://stackoverflow.com/questions/22675704/c-sharp-client-server-using-streamreader-writer