我有一个运行良好的客户端/服务器应用程序,但是它缺少一个关键的行为来使它更可靠。
目前,就网络能力而言,它远非“强大”。我正在努力实现它,研究使我相信我需要某种协议来确保在网络传输过程中不会丢失任何数据。
我听说过几种方法。我认为最适合我们情况的一种方法是使用终止符,例如<EOF>
标签。我的问题是我不确定实现这一点的最佳方法。
在找出最佳解决方案后,我将修改几个代码片段以包含终止符。
客户:
TcpClient client = new TcpClient();
client.Connect(hostname, portNo);
using (var stream = client.GetStream())
{
//send request
stream.Write(data, 0, data.Length);
stream.Flush();
//read server response
if (stream.CanRead)
{
byte[] buffer = new byte[1024];
string response = "";
int bytesRead = 0;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
response += Encoding.ASCII.GetString(buffer, 0, bytesRead);
} //trying to replace 'DataAvailable', it doesn't work well
while (stream.DataAvailable);
}
}
请注意,我正在尝试替换stream.DataAvailable
在流中检查更多数据的方法。它一直在造成问题。
服务器:
var listener = new TcpListener(IPAddress.Any, portNo);
listener.Start();
var client = listener.AcceptTcpClient();
using (var stream = client.GetStream())
{
var ms = new System.IO.MemoryStream();
byte[] buffer = new byte[4096];
int bytesRead = 0;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
ms.Write(buffer, 0, bytesRead);
} //also trying to replace this 'stream.DataAvailable'
while (stream.DataAvailable);
ms.Position = 0;
string requestString = Encoding.UTF8.GetString(ms.ToArray());
ms.Position = 0;
/*
process request and create 'response'
*/
byte[] responseBytes = Encoding.UTF8.GetBytes(response);
stream.Write(responseBytes, 0, responseBytes.Length);
stream.Flush();
}
那么,给定这两个代码示例,我如何修改它们以包含并检查某种数据终止符,表明停止读取数据是安全的?