C#實現區域網路檔案傳輸

來源:互聯網
上載者:User

網路通訊一般都是通過Socket進行的,稱為進程通訊機制,通常也稱作"通訊端",用於描述IP地址和連接埠,是一個通訊鏈的控制代碼。

先學習一下socket基本原理:

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

Socket的形像理解:

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

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

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

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

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

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

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

 

Socket 通訊應用示圖

 

 

 

TCP/IP 用戶端/服務端通訊流程圖

 

 

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

在這裡,做了一個區域網路內檔案傳輸程式,其實模仿飛鴿傳輸的功能。

在公司裡面是禁用QQ,不能使用QQ,有時發現挺麻煩的,傳輸檔案不方便,搞得經常要用隨身碟來拷東西。

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

傳送檔案程式碼片段:

View Code

/// <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();
}

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.