黑马程序员技术交流社区

标题: C#中Socket传输文件 [打印本页]

作者: 古古头    时间: 2012-7-5 19:22
标题: C#中Socket传输文件
有没有谁做过在一个局域网中传输文件的,有的话最好把源码贴上来,谢谢了!!!
作者: 许庭洲    时间: 2012-7-6 08:07
Socket sendSocket = null;
try
{
     sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     sendSocket.Connect(IP);

     string fileName = Path.GetFileName(filePath);

      byte[] buffCompanyID = new byte[4];
      buffCompanyID = BitConverter.GetBytes(fCompanyID);

      byte[] buffImageLength = new byte[4];
      buffImageLength = BitConverter.GetBytes(fileName.Length);
      byte[] buffImageName = new byte[fileName.Length];
      buffImageName = Encoding.Default.GetBytes(fileName);

      Stream s = File.Open(filePath, FileMode.Open);
      int leng = 0;
      if (s.Length < int.MaxValue)
      leng = (int)s.Length;
      byte[] by = new byte[leng];
      s.Read(by, 0, leng);
      s.Close();

      MemoryStream ms = new MemoryStream();
      ms.Write(buffCompanyID, 0, 4);
      ms.Write(buffImageLength, 0, 4);
      ms.Write(buffImageName, 0, fileName.Length);
      ms.Write(by, 0, leng);
      byte[] anotherBytes = ms.GetBuffer();

      sendSocket.Send(anotherBytes, 8 + fileName.Length + leng, SocketFlags.None);
}
catch (System.Exception ex)
{
          throw ex;
}
finally
{
    if (sendSocket != null)
      {
            sendSocket.Shutdown(SocketShutdown.Both);
             sendSocket.Close();
        }
}
   return true;
}
作者: 戴水平    时间: 2012-7-7 13:57
using System.Net.Sockets;//引用命名空间别忘了哦
using System.Net;//引用命名空间别忘了哦
using System.Threading;//引用命名空间别忘了哦
using System.IO;//引用命名空间别忘了哦
private void btnSendFile_Click(object sender, EventArgs e)
        {
            try
            {
                using (FileStream filestream = new FileStream(txtPath.Text, FileMode.Open))//using 管理资源,因为filestream非常占用资源
                {
                    byte[] Filebuffer = new byte[1024 * 1024 * 2];//定义一个字节数组缓冲区(2M的空间)
                     filestream.Read(Filebuffer, 0, Filebuffer.Length);//从文件中读出数据

                                     socketClient.Send(Filebuffer);
                    MessageBox.Show("文件已发送!");
                }

            }
  private void selectFile_Click(object sender, EventArgs e)//选择文件操作
        {
            OpenFileDialog openfile = new OpenFileDialog();
        
            if (openfile .ShowDialog()==DialogResult.OK)
            {
                openfile.Multiselect = false;
         
                txtPath.Text = openfile.FileName;
            }
        }
作者: 侯慧杰    时间: 2012-7-8 16:44
发送端主要的代码:
private void btnSendFile_Click(object sender, EventArgs e)
        {
            using(FileStream stream = new FileStream(txtFileName.Text, FileMode.Open))
            {
                byte[] buffer=new byte[1024*1024*2];//发送的文件最大不超过2M
                int length = stream.Read(buffer, 0,buffer.Length);
                byte[] sendBuffer=new byte[buffer.Length+1];
                sendBuffer[0] = 1;//表示要发送的是文件
                Buffer.BlockCopy(buffer, 0, sendBuffer, 1, length);
                s.Send(sendBuffer);

            }

        }
接受端主要代码代码:
void receive( object ss)
{
if (b[0] == 1)//表示发送过来的是文件
                    {
                        SaveFileDialog sfd = new SaveFileDialog();
                        if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            string FileSavePath = sfd.FileName;
                            using (FileStream fs = new FileStream(FileSavePath, FileMode.Create))
                            {
                                fs.Write(b, 1, length - 1);
                                txtService.AppendText("文件保存成功!" + FileSavePath + "\n");
                            }
                        }

                    }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2