我正在读一本关于.NET中的套接字的书,有一些我遇到的问题并且无法解决。
这是一本直接显示TCP echo客户端和服务器的书的例子。
这是客户端应用程序:
byte[] byteBuffer = Encoding.ASCII.GetBytes(input);
TcpClient client = null;
NetworkStream netStream = null;
try
{
// Create socket that is connected to server on specified port
client = new TcpClient(server, port);
netStream = client.GetStream();
// Send the encoded string to the server
netStream.Write(byteBuffer, 0, byteBuffer.Length);
Console.WriteLine("Sent {0} bytes to server...", byteBuffer.Length);
int totalBytesRecieved = 0; //total bytes recieved so far
int bytesRecieved = 0; //bytes recieved in the last read
while (totalBytesRecieved < byteBuffer.Length)
{
if ((bytesRecieved = netStream.Read(byteBuffer, totalBytesRecieved,
byteBuffer.Length - totalBytesRecieved)) == 0)
{
Console.WriteLine("connection closed prematurly");
}
totalBytesRecieved += bytesRecieved;
}
Console.WriteLine("Received {0} bytes from server: {1}", totalBytesRecieved,
Encoding.ASCII.GetString(byteBuffer, 0, totalBytesRecieved));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
netStream.Close();
client.Close();
}
这是服务器应用程序:
TcpListener listener = null;
try
{
// Create a TCPListener to accept client connections
listener = new TcpListener(IPAddress.Any, serverPort);
listener.Start();
}
catch (SocketException se)
{
Console.WriteLine(se.ErrorCode + ": " + se.Message);
Environment.Exit(se.ErrorCode);
}
byte[] byteBuffer = new byte[BUFFSIZE]; //recieve buffer
int bytesRecieved; //recieved byte count
while (true)
{
TcpClient client = null;
NetworkStream netStream = null;
try
{
client = listener.AcceptTcpClient();
netStream = client.GetStream();
Console.Write("Handling Clinet - ");
// Receive until client closes connection, indicated by 0 return value
int totalBytesEchoed = 0;
while ((bytesRecieved = netStream.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
netStream.Write(byteBuffer, 0, bytesRecieved);
totalBytesEchoed += bytesRecieved;
}
Console.WriteLine("echoed {0} bytes.", totalBytesEchoed);
// Close the stream and socket. We are done with this client!
netStream.Close();
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
我的主要问题是应用程序的流部分。我将尝试解释两个应用程序中发生的情况并提出一些问题,如果我在解释中出错,请纠正我:
在客户端应用程序中,我们首先将字节缓冲区写入已在客户端和服务器之间建立的流。语法很简单,这里没什么不对的。接下来,在服务器对流完成一些操作之后,我们将一些字节读到完全相同的缓冲区。当我们想要读取数据时,我们必须在循环中执行它以获取块中的数据,然后将接收的字节写入字节缓冲区。 Read()
方法的语法如下:
第一个参数接受缓冲区数组,第二个参数接受偏移量,第三个参数是放入缓冲区的最大字节数。
由于我们要填充字节缓冲区,我们应该指定接收的总字节数以填充缓冲区数组的REST,并将byteBuffer.Length - totalBytesRecieved
声明为放入缓冲区的最大字节数。这里没问题。但问题是:
程序如何知道服务器对流进行了一些操作然后读取数据?
现在在服务器应用程序中,我无法理解读取数据时发生了什么。我们读入整个缓冲区数组,然后将其全部写入流中。
我们不应该用偏移量写数据吗?有人会解释这种写作和阅读是如何起作用的吗?
读取和写入方法如何相互冲突,因为它们在同一个流上运行(相同的字节序列)?“
该程序如何知道下一个数据的读取位置以及将下一个数据写入流中的位置?