发了很多贴了 都没真正的结觉问题。我是用两个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.Start();
            while (true)
            {
                TcpClient client = L.AcceptTcpClient();
                byte[] by = new byte[300];
                NetworkStream ns = client.GetStream();
                ns.Read(by, 0, 300);
                string message;
                int start = 0;
                int end = 0;
                string IsYes = "";
                string ip = "";
                string FileLength = "";
                message = System.Text.Encoding.ASCII.GetString(by, 0, by.Length);
                if (message.Substring(0, 5) != "start")
                {
                    IsYes = message.Substring(0, 3);
                    start = message.LastIndexOf("#");
                    end = message.LastIndexOf("$");
                    ip = message.Substring(end + 1, 20);
                    FileLength = message.Substring(4, (end - start - 1));
                }
                else
                {
                    IsYes = message.Substring(0, 5);
                }                if (IsYes == "yes")
                {
                    textBox2.Text += "接送到传输请求" + IsYes + "文件长度为" + FileLength + "对方iP为" + ip;
                    BlackDelegatel bdg = new BlackDelegatel(SetTimer);
                    BeginInvoke(bdg);
                }
                if (IsYes == "start")
                {
                    if (FilePath != "")
                    {
                        TranFile();
                    }
                }
            }
        }
《-----------------------------------------------》  /// <summary>
        /// 传输文件
        /// </summary>
        public void TranFile()
        {
            
            FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint hostEP = new IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 60000);            try
            {
                //尝试连接 
                socket.Connect(hostEP);
            }
            catch
            {
                return;
            }
            Byte[] sendstring = Encoding.ASCII.GetBytes(("$" + FilePath + "#").ToCharArray());
            socket.Send(sendstring);            byte[] sender2 = new byte[30000];
            while (true)
            {
                int count = br.Read(sender2, 0, 30000);
                if (count == 0)
                {
                    break;
                }
                socket.Send(sender2, count, SocketFlags.None);
            }            socket.Close();
            fs.Close();
            br.Close(); 
        }

解决方案 »

  1.   

    client               server
    45727  --连接--->     9088
    36327  --连接--->     9088
    32144  --连接--->     9088就是这样一个逻辑,看不出来为什么要用多端口.客户端启动多个下载线程即可,每个线程持有自己单独享用的sokcet对象.server端采取异步socket编程即可,也没有什么太特殊的.
    和多用户同时请求 单个server没有本质区别,只不过现在不是多用户,而是你本地模拟多用户.(但实质上是一样的)
      

  2.   

    chichenzhe
           能不能给段代码 看看 你那个逻辑我懂我只是没有真正的理解socket异步编程