socket 文件传输优化问题 高手进来帮忙啊!还有500分可以散!

cqsfd 2009-11-13 10:49:31
哇哈哈,真是败家啊,辛苦回帖几个月的分要被我散光了!
前两个帖子,非常感谢青龙白虎兄等各位的指导,明白了很多,也进行了一点点优化,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 这些使用的原则是什么?尽量把所以程序都括起来?还是尽量少用?
...全文
321 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
伽百叶 2011-09-05
  • 打赏
  • 举报
回复
学习了 顶
kingrain213 2010-05-25
  • 打赏
  • 举报
回复
最后做出来了么?能否给俺参考一下啊,俺也正做文件传输这块呢,不太懂
sharpe 2009-11-14
  • 打赏
  • 举报
回复
现在你主要问题是什么?就是产生了多个端口吗?
jieon 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cqsfd 的回复:]
引用 1 楼 zengfanxing 的回复:
帮顶下。还有4分升仙了。

3Q
我的帖子里肯定帮你升仙啦
另外加个问题:
谁有比较好的UDP传输的资料或者框架?贴出来大家学习下!分也大大的有!
[/Quote]
最好不用UDP,相当不稳,难实现。



socket.Shutdown(SocketShutdown.Both);

3.udp我也研究过长段时间,试验后还是放弃了
例子:http://www.cnblogs.com/lixingtie/archive/2009/07/06/1517896.html
http://blog.csdn.net/lithe/archive/2005/11/08/525238.aspx
其实都差不多网上的例子。
  • 打赏
  • 举报
回复
偶来数分的!
cqsfd 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sharpe 的回复:]
现在你主要问题是什么?就是产生了多个端口吗?
[/Quote]

多谢关注!

问题1:
为什么有那么多端口?

问题2:
像我这段程序,如何在文件传输完后手动释放资源?

问题3:
谁可以提供一个UDP传输的资料?
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hhc123 的回复:]
真是不明白为什么不用UDP?
[/Quote]

想用啊 可惜不会 那些丢包什么的误差控制,不知道怎么解决,难道C#里的UDP传输,已经帮用户都考虑好,封装好啦?
兄弟提供个资料可以不?贴个代码片段也行
hhc123 2009-11-13
  • 打赏
  • 举报
回复
真是不明白为什么不用UDP?
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhouyanfss 的回复:]
...偶还差好多 。。。
[/Quote]
把我所以分都砸给你都升不了...

大家知道点什么的都说出来啊,也许你自己觉得好像很简单,但我们这些新手是完全不懂的
就好比try这些,大家可以多说说自己使用的心得嘛

在我这里回帖,谈自己经验拿分,总比随便上网搜个链接贴给人家拿分 来得要有意义啊

呼唤青龙白虎兄,来给我们说说,如果程序里有一个
private Socket tcpc
tcpc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpc.Connect(new IPEndPoint(IPadd, 9001));
打开本地端口信息,会显示几个端口与服务器9001链接呢?链接的工作机理如何?
zhouyanfss 2009-11-13
  • 打赏
  • 举报
回复
...偶还差好多 。。。
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zengfanxing 的回复:]
帮顶下。还有4分升仙了。
[/Quote]
3Q
我的帖子里肯定帮你升仙啦
另外加个问题:
谁有比较好的UDP传输的资料或者框架?贴出来大家学习下!分也大大的有!
红街咖啡 2009-11-13
  • 打赏
  • 举报
回复
帮顶下。还有4分升仙了。
辉太郎 2009-11-13
  • 打赏
  • 举报
回复
好贴,值得收藏,值得学习
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 agentianle 的回复:]
楼主的帖子情况很复杂,也涉及到一些我不熟悉的类,所以就避而不谈了。

如果是我来做这个东西,我会做如下考虑,供楼主参详:

0、如果FTP可以满足,直接调用FTP客户端模块,服务器架设FTP服务,return;

1、方案肯定是Socket传输,二进制处理。至于UDP还是TCP,如果条件许可,那一定是TCP,如果不许可,则是UDP,甚至在某些需要穿透防火墙的环境下,需要考虑http和ftp。网络传输协议这一块,是根据环境来选择;

2、如果选择TCP传输,那么,我会首先想到期间的断点续传、分割传输等问题。会考虑参考FTP协议,看看能不能借鉴其中的设计思想;

3、UPD我不熟,没搞过。知道其中关键在分包,包的丢失检测等处理。

4、http可以走webservice,把文件按二进制读取,base64转换为字符串传输。当然,文件分割和断点续传等思想是一样的。


其他一些

Release版本的try是尽量包括最少代码,完美效率考虑的话,仅仅包括可能出错的语句。
但有时候,为了兼顾编码效率,多try一点也没关系。

Debug版本可以在测试调用时大大的try一个,为了尽快定位错误所在。

但是网络程序仅仅try还不够,这里面涉及多线程,应用层协议,网络底层等很多东西,多输出,有利于排错。

另外,曾为公司写过一个RawRemoting框架,其中自己设计了一个Socket通讯层的封装。公司现在转向J2EE去了,以后如果能征得公司同意,原先这些代码任由我处置的话,可以发给你一份作参考。

[/Quote]
要是能发一份给我就太好了,非常感谢!我的邮箱:cqsfd@mail.ustc.edu.cn,公司很悲剧的使用教育网...

现在这个C/S架构,是公司一个搞J2EE的大牛定下的,但在我们这只是兼职,所以都他让我怎么通信,我就怎么做,基本他做主,平时和他交流也少。他定下用TCP socket,就这么做了。我现在搞的就是分割传输,断点续传也想搞,基本技术都研究得差不多的时候,大牛说不做了,因为我们的文件传输是经过服务器转发,不保存在服务器上的。而如果要做到真正意义的断点续传,得传输的两边都装我们的客户端才行。给想做断点续传的兄弟提个醒:技术的重点不仅仅是考虑断点的位置,还得考虑接收端的内存空间!注意观察迅雷的未传输完成的文件,虽然是没输入完,但这个文件占的大小,和完整文件一样的,为什么就不用我详细说了。

另外,终于搞懂一点:尽量少用try,原来是针对Release版本的...
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hassss2008 的回复:]
你是想一次发送多个文件,类似飞鸽,还是一次发送一个。。。。
[/Quote]
想做个同时传输多个文件,而每个文件又同时有好几个线程在传输,有点类似迅雷,但比那个弱
现在只做了同时传输多个文件

大家有好点子就提啊 我做好了贴出来和大家分享
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qldsrx 的回复:]
一般情况下,都是客户端向服务端发送指令,然后服务端响应请求,你怎么倒过来啦,难道服务端还有人在控制吗?

你一个线程去接收服务器9000端口发过来的指令,接收到一个指令后是不是就关闭连接重新去连9000端口了呢?是的话,就会在本地多增加一个连接端口。
[/Quote]
抱歉啊,出去了几个小时
10楼的兄弟说得对,我就是那么做的。9000端口上的链接是接收命令的,一直存在;9001端口,是在接到GET_FILE命令后才与服务器链接的,链接玩完后关闭
另外,服务器和客户端不在同一台机器上的
huing 2009-11-13
  • 打赏
  • 举报
回复
情况和你差不多哈,等高人来答题
http://topic.csdn.net/u/20091113/17/7028c84f-11fc-43f1-b90c-bb2dce89334d.html?25807
viki117 2009-11-13
  • 打赏
  • 举报
回复
升级,不指望了。。差的太多了。。。
天乐 2009-11-13
  • 打赏
  • 举报
回复
楼主的帖子情况很复杂,也涉及到一些我不熟悉的类,所以就避而不谈了。

如果是我来做这个东西,我会做如下考虑,供楼主参详:

0、如果FTP可以满足,直接调用FTP客户端模块,服务器架设FTP服务,return;

1、方案肯定是Socket传输,二进制处理。至于UDP还是TCP,如果条件许可,那一定是TCP,如果不许可,则是UDP,甚至在某些需要穿透防火墙的环境下,需要考虑http和ftp。网络传输协议这一块,是根据环境来选择;

2、如果选择TCP传输,那么,我会首先想到期间的断点续传、分割传输等问题。会考虑参考FTP协议,看看能不能借鉴其中的设计思想;

3、UPD我不熟,没搞过。知道其中关键在分包,包的丢失检测等处理。

4、http可以走webservice,把文件按二进制读取,base64转换为字符串传输。当然,文件分割和断点续传等思想是一样的。


其他一些

Release版本的try是尽量包括最少代码,完美效率考虑的话,仅仅包括可能出错的语句。
但有时候,为了兼顾编码效率,多try一点也没关系。

Debug版本可以在测试调用时大大的try一个,为了尽快定位错误所在。

但是网络程序仅仅try还不够,这里面涉及多线程,应用层协议,网络底层等很多东西,多输出,有利于排错。

另外,曾为公司写过一个RawRemoting框架,其中自己设计了一个Socket通讯层的封装。公司现在转向J2EE去了,以后如果能征得公司同意,原先这些代码任由我处置的话,可以发给你一份作参考。
hassss2008 2009-11-13
  • 打赏
  • 举报
回复
你是想一次发送多个文件,类似飞鸽,还是一次发送一个。。。。
加载更多回复(4)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧