客户端发送:

using  ; 
using .Sockets ; 
using System.IO ; 
using System.Text ; 
using System.Threading ;
         private FileStream SentFile;         
         Socket socket;         
         Thread mythread ;
         //选择文件
         private void button1_Click(object sender, System.EventArgs e)
         { 
 
              if (openFileDialog1.ShowDialog(this)==DialogResult.OK)
                   txtFileName.Text = openFileDialog1.FileName;
         }
         //发送文件大小信息
         private void button2_Click(object sender, System.EventArgs e)
         { 
 
              string ip=this.txtRemoIP.Text;
              string port=this.txtRemoport.Text;
              IPAddress serverIp=IPAddress.Parse(ip);            
              int serverPort=Convert.ToInt32(port);
              IPEndPoint iep=new IPEndPoint(serverIp,serverPort);  
              IPHostEntry host = Dns.GetHostByAddress(iep.Address ) ; 
              string HostName = host.HostName; 
              
              socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
              socket.Connect(iep);
              string filename=this.txtFileName.Text;
              SentFile = new FileStream(filename, FileMode.Open, FileAccess.Read,FileShare.Read);
              int nPos = filename.LastIndexOf("\\");
              if (nPos > -1)
                   filename = filename.Substring(nPos+1);//查找不含路径的文件名
              string fileinfo="\x01\x53"+SentFile.Length.ToString()+"\x03";
              byte[] byteData = Encoding.ASCII.GetBytes(fileinfo);
              Send(socket,byteData);
         }
         //发送文件数据 
         private void button4_Click(object sender, System.EventArgs e)
         { 
 
              string ip=this.txtRemoIP.Text;
              string port=this.txtRemoport.Text;
              IPAddress serverIp=IPAddress.Parse(ip);            
              int serverPort=Convert.ToInt32(port);
              IPEndPoint iep=new IPEndPoint(serverIp,serverPort);  
              IPHostEntry host = Dns.GetHostByAddress(iep.Address ) ; 
              string HostName = host.HostName; 
              
              socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
              socket.Connect(iep);
              
              this.label3.Text=DateTime.Now.ToString();
              long filesize=SentFile.Length;
              byte[] buffer = new byte[filesize];            
              int len=SentFile.Read(buffer,0,buffer.Length);          
              Send(socket,buffer);
         }        
         //异步发送
         private void Send(Socket handler, byte[] byteData) 
         {             
//            byte[] byteData = Encoding.ASCII.GetBytes(data);             
              handler.BeginSend(byteData, 0, byteData.Length, 0,
                   new AsyncCallback(SendCallback), handler);              
         }
         private static void SendCallback(IAsyncResult ar) 
         { 
 
              try 
              {                  
                   Socket handler = (Socket) ar.AsyncState;                
                   int bytesSent = handler.EndSend(ar);
                   handler.Shutdown(SocketShutdown.Both);
                   handler.Close();
              } 
              catch (Exception ex) 
              { 
 
                   MessageBox.Show(ex.ToString());
              }
         }

服务端接收:

         

public static ManualResetEvent allDone = new ManualResetEvent(false);      
         private Thread th;
         private bool listenerRun = true ; 
         Socket listener;
         private const int MAX_SOCKET=10; 
         long filesize=0;       
         int filerby=0;
         FileStream fs=new FileStream("data.txt",FileMode.Create);
         public static IPAddress GetServerIP()
         { 
 
              IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());
              return ieh.AddressList[0];
         }
         //侦听方法
         private void Listen() 
         { 
              try 
              { 
                   int nPort=int.Parse(this.txtLocalPort.Text);
                   IPAddress ServerIp=GetServerIP();
                   IPEndPoint iep=new IPEndPoint(ServerIp,nPort);
                   listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                   listener.Bind(iep); 
                   listener.Listen(10);
                   while(listenerRun)
                   {                           
                       allDone.Reset();
                       listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
                       allDone.WaitOne();                   
                   }
              } 
              catch (System.Security.SecurityException ) 
              { 
                   MessageBox.Show ("防火墙安全错误!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); 
              } 
         }
         //
         public void AcceptCallback(IAsyncResult ar) 
         {             
              Socket listener = (Socket)ar.AsyncState;
              Socket client=listener.EndAccept(ar) ;
              allDone.Set();
              StateObject state = new StateObject();
              state.workSocket = client;
              
              this.statusBar1.Text="已经连接!";
              client.BeginReceive( state.buffer,0, StateObject.BufferSize, 0,
                   new AsyncCallback(readCallback), state);                     
         }
         public void readCallback(IAsyncResult ar) 
         {             
              StateObject state = (StateObject) ar.AsyncState;
              Socket handler = state.workSocket;             
              int bytesRead = handler.EndReceive(ar);            
              if (bytesRead > 0)
              {                                         
                   string strmsg=Encoding.ASCII.GetString(state.buffer,0,bytesRead);                   
                   if(strmsg.IndexOf("\x01\x53")>-1)//文件大小信息
                   { 
 
                       int s=strmsg.IndexOf("\x01\x53");
                       int e=strmsg.IndexOf("\x03");
                       string strsize=strmsg.Substring(s+2,e-s-2);
                       filesize=long.Parse(strsize);
                       this.label1.Text="该文件大小:"+strsize;                     
                   }    
                   else//文件数据
                   { 
 
                       this.label1.Text="正在接收文件....";
                       if((filerby+bytesRead)>=filesize) 
                       {                      
                            //接收到完整的信息     
                            fs.Write(state.buffer,0,bytesRead);
                            fs.Flush();        
                            fs.Close();
                            this.label1.Text="接收完毕!"+DateTime.Now.ToString();                                             
                       }
                       else
                       {             
                            fs.Write(state.buffer,0,bytesRead);  
                            filerby+=bytesRead;              
                            handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,
                                 new AsyncCallback(readCallback), state);
                       }
                   }
              }
         }
         private void btnListen_Click(object sender, System.EventArgs e)
         { 
 
              th = new Thread (new ThreadStart(Listen));//以Listen过程来初始化线程实例       
              th.Start();//启动此线程 
              this.btnListen.Enabled=false;        
         }
     //异步传递的状态对象
     public class StateObject 
     { 
 
         public Socket workSocket = null;
         public const int BufferSize = 1024;
         public byte[] buffer = new byte[BufferSize];
         public StringBuilder sb = new StringBuilder();
     }