原帖链接
http://topic.csdn.net/u/20091112/11/54935b2f-b2b8-4d58-af30-40379860e581.html
回帖中还有几个小问题,一并帮着看看吧
本人新手,只有几个月的实习经验,也不知道问的问题是不是比较白痴...跪求各位高手指点。两个问题200分,不需要修改我的程序,给我点明程序思想即可,另开一贴给100分
下面是我写的一个socket文件传输程序片段,总体思路是:
1:一个线程循环接收服务器发出的指令
2:当接收到传输文件的指令时,就把需传输的文件信息插入队列
3:同时生成一个新的传输文件类,该类work()方法启动一个新线程,从队列中提取文件信息进行相应文件的传输
具体代码如下
else if (sCommand == "GET_FILE")
{
.....
queue.Enqueue(Uuid + '|' + sPath); //queue队列是自己定义的线程同步的队列,同步问题不需要考虑
Send_filesClass cc = new Send_filesClass();
cc.work();
}
public class Send_filesClass
{
private TcpClient tcpc;
public Send_filesClass()
{
this.tcpc = new TcpClient(xxx, 9001);
}
public void work()
{
Thread t = new Thread(new ThreadStart(run));
t.IsBackground = true;
t.Start();
}
private void run()
{
NetworkStream nstream = tcpc.GetStream();
... //while循环:fFileStream文件流读文件,每次102字节,再用nstream发送出去
fFileStream.Close();
Thread.Sleep(500);
nstream.Close();
tcpc.Close();
}
}
现在的问题是:
1:每次同时传输2个文件,我打开本机cmd 输入netstat -a 查看9001端口,2个文件有时会有8个在打开的端口,其中的大部分状态是Time_Wait,为什么呢?是不是我程序中间的设计有问题?有人和我说过,Send_filesClass这个类中,需要用到的socket在构造时传入就好,用一个nstream获取其中的流;但是这个socket不是任何时候都需要,不是长连接的,用完就关掉,不好判断它什么时候被实例化好,所以我把socket放到类中。是不是这里有问题?还有就是这个类传输完文件后,何时被系统回收?我在程序中写的是每次传输完,线程sleep半秒后就关闭流,可是查看本机端口信息,基本都得等个10-20秒端口才释放出来,那这个类岂不是在内存中留得更久?如何在程序中手动释放资源?
2:传输效率非常低。
我用自己机器测试,把文件发送到服务器的同时,将其下载到本机。
刚开始下载时,和网上其他下载资源差不多,都是一上来速度达到疯狂的几百K,1-2秒后,基本都维持在20k左右,这是为什么?如何提高?
我有个想法,对Send_filesClass类中传输文件的方法进行修改:将文件流一段段的先读出来,插入一个队列,再从队列中取流发送出去;如果只用一个线程取流发送,是不是可以省去文件流读取的时间?相当与先将文件流读入内存再发送?
如果我将每段文件流编号,用N多的线程从队列取流出来发送,服务器端接收到再组装起来,传输效率能提高很多吗?
问题比较琐碎,希望高手们踊跃发言,很多和我一样的新手,都将感恩戴德