程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#實現局域網文件傳輸

C#實現局域網文件傳輸

編輯:C#入門知識

網絡通信一般都是通過Socket進行的,稱為進程通信機制,通常也稱作"套接字",用於描述ip地址和端口,是一個通信鏈的句柄。

先學習一下socket基本原理:

socket原理:
  在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原意那樣,象一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。

 Socket的形像理解:

socket非常類似於電話插座。以一個國家級電話網為例。

電話的通話雙方相當於相互通信的2個進程,區號是它的網絡地址;區內一個單位的交換機相當於一台主機,主機分配給每個用戶的局內號碼相當於socket號。

任何用戶在通話之前,首先要占有一部電話機,相當於申請一個socket;同時要知道對方的號碼,相當於對方有一個固定的socket。

然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網絡地址)。

對方假如在場並空閒(相當於通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當於連接成功。

雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當於向socket發送數據和從socket接收數據。

通話結束後,一方掛起電話機相當於關閉socket,撤消連接。

 

Socket 通信應用示圖

 

 

 

TCP/IP 客戶端/服務端通信流程圖

 

 

通過Socket通信原理的認識,下面可以開始寫一個簡單的通信程序,進行驗證。

在這裡,做了一個局域網內文件傳輸程序,其實模仿飛鴿傳輸的功能。

在公司裡面是禁用QQ,不能使用QQ,有時發現挺麻煩的,傳輸文件不方便,搞得經常要用U盤來拷東西。

為此,我設想寫一個簡單的局域網文件傳輸入工具,暫時解決不能上QQ的痛苦。

發送文件代碼片段:

      
  /// <summary>
        /// 發送文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        PRivate void btnSentFile_Click(object sender, EventArgs e)
        {
            //打開文件
            OpenFileDialog dlg = new OpenFileDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < lvwDisplayUser.SelectedItems.Count; i++)
                {
                    string ip = this.lvwDisplayUser.SelectedItems[i].SubItems[2].Text;

                    //初始化接受套接字:尋址方案,以字符流方式和Tcp通信
                    socketSent = new Socket(AddressFamily.InterNetwork,
                           SocketType.Stream,
                           ProtocolType.Tcp);

                    //設置服務器IP地址和端口
                    ipSent = new IPEndPoint(IPAddress.Parse(ip), 8001);

                    //與服務器進行連接
                    LanSocket socketConnet = new LanSocket(socketSent, ipSent);
                    Thread tConnection = new Thread(new ThreadStart(socketConnet.SocketConnect));
                    tConnection.Start();

                    Thread.Sleep(100);
                    //將要發送的文件加上"DAT"標識符

                    SentLanFile sentFile = new SentLanFile(dlg, socketSent);
                    Thread tSentFile = new Thread(new ThreadStart(sentFile.SentFile));
                    tSentFile.Start();
                }
            }
        }
  
        /// <summary>
        /// 發送文件
        /// </summary>
        public void SentFile()
        {
            string msg = "0DAT " + dlg.FileName;

            //將 "msg" 轉化為字節流的形式進行傳送
            socketSent.Send(Encoding.Default.GetBytes(msg));

            //定義一個讀文件流
            FileStream read = new FileStream(dlg.FileName, FileMode.Open, Fileaccess.Read);

            //設置緩沖區為1024byte
            byte[] buff = new byte[1024];
            int len = 0;
            while ((len = read.Read(buff, 0, 1024)) != 0)
            {
                //按實際的字節總量發送信息
                socketSent.Send(buff, 0, len, SocketFlags.None);
            }

            //將要發送信息的最後加上"END"標識符
            msg = "END";

            //將 "msg" 發送
            socketSent.Send(Encoding.Default.GetBytes(msg));
            socketSent.Close();
            read.Close();
        }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved