【发布时间】:2009-06-18 15:18:07
【问题描述】:
我正在开发一个简单的应用程序,使用 TCPListener 和 TCPClient 类通过 TCP 发送文件。这是发送文件的代码。
Stop 是一个 volatile 布尔值,有助于随时停止进程,并且 WRITE_BUFFER_SIZE 可能会在运行时更改(另一个 volatile)
while (remaining > 0 && !stop)
{
DateTime current = DateTime.Now;
int bufferSize = WRITTE_BUFFER_SIZE;
buffer = new byte[bufferSize];
int readed = fileStream.Read(buffer, 0, bufferSize);
stream.Write(buffer, 0, readed);
stream.Flush();
remaining -= readed;
// Wait in order to guarantee send speed
TimeSpan difference = DateTime.Now.Subtract(current);
double seconds = (bufferSize / Speed);
int wait = (int)Math.Floor(seconds * 1000);
wait -= difference.Milliseconds;
if (wait > 10)
Thread.Sleep(wait);
}
stream.Close();
这是处理接收方的代码:
do
{
readed = stream.Read(buffer, 0, READ_BUFFER_SIZE);
// write to .part file and flush to disk
outputStream.Write(buffer, 0, readed);
outputStream.Flush();
offset += readed;
} while (!stop && readed > 0);
现在,当速度较低(大约 5KBps)时,一切正常,但是随着速度的提高,接收器大小变得更容易在从流中读取时引发 SocketException。我猜这与在读取所有数据之前关闭远程套接字有关,但是正确的方法是什么?我应该什么时候关闭发送客户端?
我在 google 上没有找到任何好的文件传输示例,而我发现的示例与我正在做的事情有类似的实现,所以我想我遗漏了一些东西。
编辑:我收到此错误“无法从传输连接读取数据”。这是一个 IOException,其内部异常是一个 SocketException。
我已经在 sender 函数中添加了这个,但我仍然得到同样的错误,代码永远不会到达 stream.close(),当然 tcpclient 永远不会真正关闭......所以我现在完全迷路了。
buffer = new byte[1];
client.Client.Receive(buffer);
stream.Close();
【问题讨论】:
-
实际上应用程序既是客户端又是服务器。目前我正在从应用程序转移到自身,所以是的,客户端是发送者。