哇哈哈,真是败家啊,辛苦回帖几个月的分要被我散光了!
前两个帖子,非常感谢青龙白虎兄等各位的指导,明白了很多,也进行了一点点优化,200分散得值
前面两个帖子的链接
http://topic.csdn.net/u/20091112/21/c11ee3e5-f264-4632-b1bb-bf7dcb8e33cc.html
http://topic.csdn.net/u/20091112/11/54935b2f-b2b8-4d58-af30-40379860e581.html
正在做socket的兄弟们可以去看看,也好帮我解答其他问题
下面是我写的一个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 Socket tcpc;
public Send_filesClass()
{
tcpc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpc.Connect(new IPEndPoint(IPadd, 9001)); }
public void work()
{
Thread t = new Thread(new ThreadStart(run));
t.IsBackground = true;
t.Start();
}
private void run()
{
... //while循环:fFileStream文件流读文件,每次1024字节,再用tcpc.send发送出去
fFileStream.Close();
Thread.Sleep(500);
tcpc.Close();
}
}
现在的问题:
1:如果同时传输2个文件,我打开本机cmd 输入netstat -a 查看9001端口,2个文件有时会有8个在打开的端口,其中的大部分状态是Time_Wait,为什么呢?后来用socket进行链接,2个文件出现了6个端口,比之前用NetworkStream少了...这些端口中,只有2个是显示建立链接的,其他都在time_wait.是不是我程序中间的设计有问题?有人和我说过,Send_filesClass这个类中,需要用到的socket在构造时传入就好,把这个socket值传个类中一个自己的成员socket1,传输文件就用socket1;但是这个socket不是任何时候都需要,不是长连接的,用完就关掉,不好判断它什么时候被实例化好,所以我把socket整个放到类中。是不是这里有问题?还是服务器那端出问题?我现在都怀疑是不是服务器那端,预留了同一文件多线程传输的端口?
2:还有就是这个类传输完文件后,何时被系统回收?我在程序中写的是每次传输完,线程sleep半秒后就关闭流,可是查看本机端口信息,基本都得等个10-20秒端口才释放出来,那这个类岂不是在内存中留得更久?如何在程序中手动释放资源?
3:try catch 这些使用的原则是什么?尽量把所以程序都括起来?还是尽量少用?