日期:2014-05-18  浏览次数:20855 次

C# Socket如和想qq一样同时接收多个文件
发了很多贴了 都没真正的结觉问题。我是用两个socket 来完成的 客户端发送传输文件请求,服务器端起一个线程来监听请求
监听到请求后 利用委托 调用按钮时按钮出现 (因为线程无法直接调用 控件属性) 当点击按钮后 向客户端发送可以发送
客户端开始发送文件 这时服务器端的 第二个socket(也在线程里)监听到了 客户端发送的文件开始 接收文件
线程都在 load里 以上代码没有错误可以很好的运行。
现在问题在于这种方式服务器端如何应对多个客户的多个 请求或者一个客户端的多个请求 我自己试验用一个客户端在一个文件没发送完事 发送第二个结果是 第二个有的时候是失败不发送 如果和第一个文件的路径相同就会写到第一个文件里 
以上代码都没用 不管是发送还是接收都没用异步 是否用异步加多线程可以解决求代码。

我自己的想法是通过 TcpListener的Pending 来判断端口是否有连接如果有在 给客户端的回发是通知客户端在新的端口号中发送请求 然后客户到在起新的线程来监听新的端口 目的是实现 到这样做不好会造成端口的混乱 而且在别帖子中人家也说这可端口没什么关系! 就是不知道用异步能否实现 怎么实现

  以下是源代码 有点乱不过很简单 没什么复杂估计高手一看便知
《-------------------------------------------------------》

  private void Form1_Load(object sender, EventArgs e) //Load里启动线程
  {
  Thread T = new Thread(new ThreadStart(this.SetFile));
  T.IsBackground = true;
  T.Start();
  Thread T1 = new Thread(new ThreadStart(this.CL));
  T1.IsBackground = true;
  T1.Start();
  }
《-----------------------------------------》
 private void CL() //用来监听 接收文件同时写出文件
  {
   
  TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 59000);
  L.Start();
  while (true)
  {
  Socket S = L.AcceptSocket();
  byte[] sender = new byte[30000];
  int count = S.Receive(sender, 30000, SocketFlags.None);
  bool sfwjm = false;
  string fn2 = "";
  int x = 0;
  for (int i = 0; i < sender.Length; i++)
  {
  if (sender[i] == '#')
  {
  x = i;
  break;
  }
  if (sfwjm == true)
  {
  fn2 += Convert.ToChar(sender[i]).ToString();
  }
  if (sender[i] == '$')
  {
  sfwjm = true;
  }
  }

  this.saveFileDialog1.Filter = "文件|*." + fn2.Substring(fn2.Length - 3);
  this.saveFileDialog1.ShowDialog();
  string fn = this.saveFileDialog1.FileName;

  FileStream fs = new FileStream(fn, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  BinaryWriter bw = new BinaryWriter(fs);
  bw.Write(sender, x, count);
  Prog pr = new Prog(Progress);


  while (true)
  {
  count = S.Receive(sender, 30000, SocketFlags.None);
  if (count == 0)
  {
  break;
  }

  bw.Write(sender, 0, count);
  BeginInvoke(pr);
  }
  fs.Close();
  bw.Close();
  MessageBox.Show("接收完毕");
  }

  }

《-------------------------------------------》

  private void SetFile() //用来监听请求 请求也是 自己组合的字符串里面有文件的长度 客户机的ip
  {
  TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 61000);
  L.