日期:2014-05-17  浏览次数:20765 次

C#winform (TCP)socket异步是不能不能实现多个文件的同时接受
本人菜鸟一只,学习学习想做个简单的传输文件的系统,用异步(Tcp)Socket实现了一个文件的接收,然后想着再这基础上改改,实现多个文件的同时接收,结果就遇到问题了。如果把接收缓冲区定义成局部变量,那收到的数据就不能当参数传进自己写的接收文件的函数中,如果定义成全局的,那就不能同时接受多个文件了。。。纠结中,各位大吓们给点意见吧

------解决方案--------------------
并发····
------解决方案--------------------
那全局数组呢?
------解决方案--------------------
引用:
本人菜鸟一只,学习学习想做个简单的传输文件的系统,用异步(Tcp)Socket实现了一个文件的接收,然后想着再这基础上改改,实现多个文件的同时接收,结果就遇到问题了。如果把接收缓冲区定义成局部变量,那收到的数据就不能当参数传进自己写的接收文件的函数中,如果定义成全局的,那就不能同时接受多个文件了。。。纠结中,各位大吓们给点意见吧


不知道你是怎样写的。

简单说一下基本的数据结构。比如说你可以定义一个客户端“会话”类型,例如
public class Session
{
    public Rfc2898DeriveBytes Aes;

    public Stream Stream;

    public TcpClient Client;     //或者  public Socket Client;

    public byte[] Buffer = new byte[1024 * 1024];

    public List<byte> Cache = new List<byte>();  // 读取到消息结束标志之前累计读取到的字节

    public UserPassport passport;   //用户登录信息

    public DateTime Timeout = DateTime.UtcNow.AddMinutes(2);  //心跳过期时间
}


然后,你的所谓“异步调用”,可以将此类型的对象作为异步调用的方法参数传送,在回调方法中则功过 AsyncState 属性取回。

面向对象最基本的一个东西就是封装。你要的领域概念自己不会封装,而只会找最浅的、别人给你定义的对象来用,那么自然就不会设计程序。
------解决方案--------------------
只纠结于一个 byte[] 是局部还是全局变量,这种设计会害了你的。你这个问题很有普遍性,基本上都是没有见过真正的程序。

这就好像一个学吃饭的小孩子放不下奶嘴,你的学习过程还没有真正开始。如果你是从网上个别文章、某个培训班的视频上学习这个编程,可以停止了。需要找真正的、稍微专业的一些软件设计和通讯程序的基础课本来学习,而不再是那种糊弄急于找工作的人的钱的培训“范例”。