传送图片程序
前言: 以C#為程序設計基礎,傳輸大圖片,并現實。在過程中,采用套接字,單線程同步機制為例子。需要深化,可以采用異步或者多線程的機制,保障能夠順利執行。
? ? ??具體代碼可以到微云下載【鏈接:http://url.cn/YpiyxY (密碼:QJtp)】
正文:
? ? ? 客戶端
? ??網絡編程,離不開套接字,客戶端套接字編程需要了解和理解清楚5個部分
? ? ? 1、如何初始化套接字socket
? ? ? ? ? ??Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
? ? ? 2、如何有效的連接
? ? ? ? ?? s.Connect("192.168.1.100",2500);
? ? ? 3、發送過程
? ? ? ? ???既然哥在這里說是大文件,肯定回使用s.SendFile來處理發送過程,這也是解決大文件的好方法。
【聰明的同學】哦,原來還有這樣的方法,仔細閱讀MSDN才行。
【可愛的老師】當你發送文件給對方的時候,對方將會打開套接字等待你,那他怎么知道你究竟有多大呢?當不知道大小的情況下接收,會遇到很大的問題,很不方便我們處理。同學們說說,會有怎樣的問題啊?
【聰明的同學】1、不知道現在的空間能否存儲。2、套接字也不知道何時終止……老師怎么才能有效解決呢?
【可愛的老師】同學們,我在開始發送之前,把文件的大小,先告之對方,這樣就可以啦!
【聰明的同學】那采用多少前綴字節呢?如果沒有統一,到時候對方也不知道哪些是前綴,哪些是文件流?
【可愛的老師】在windows 中文件的大小是用long類型來描述的,也就是大致占有8個字節,所以WINDOWS的單獨文件大小不會超過2的64次方。于是,在發送大文件之前,統一前8個字節存放文件大小,插入在文件流的最前面,然后采用數據字節流,傳送給對方,對方首先也讀取前8個字節,了解大小后,開始讀取文件,并分析該盤符時候有空間給它存放。
【聰明的同學】老師你既然可以在前面加preStream,我是不是把我的文件名稱,大小,擴展名一起存放在lastStream一起發送。
【可愛的老師】真聰明!就是這樣處理。
? ? ? ? ??FileInfo fi = new FileInfo(filepath); ?filepath 一般指的是URL 例如:C:\A.JPG
? ? ? ? ??byte[] len = BitConverter.GetBytes(fi.Length);
s.SendFile(filepath,len,null,TransmitFileOptions.UseDefaultWorkerThread); s.Shutdown(SocketShutdown.Both); ? ? ??4、接收過程
? ? ? ? ???s.Receive來接收,在這里,哥會在詳細講解。
? ? ? 5、關閉套接字
??? ? ? ???s.close()
服務器
?服務器的套接字,就有所不同,它不是鏈接對方,而是等待,所以它需要綁定自己能夠提供服務的IP地址和相應的端口號,當等待的時候,會出現中斷。所以要考慮多線程。
現在主要是處理接收大文件的方法。先取出文件的大小。
byte[] buffer = new byte[8];? ? ? ? ? ? ? ?? s.Receive(buffer,8,0); long length = BitConverter.ToInt32(buffer, 0); ? 然后申請一個
??MemoryStream MS; 內存流,如果計算器還沒有計算到總數那么多,接著循環執行。?
? ? ? ? ? ? ? ?byte[] buf=new byte[8192];? while (count <length) { readcount =s.Receive(buf, buf.Length, 0);? MS.Write(buf, 0, readcount); count += readcount;
? ? ? ? ? ? ??}? 這樣,將把所要的流讀入了MS中,如果是圖片,可以直接使用Image.FromStream(MS)提供給pictureBox顯示,當然也可以使用。
MS.sava去保存你要的格式。
好,基本上講到這里。
? ? ??具體代碼可以到微云下載【鏈接:http://url.cn/YpiyxY (密碼:QJtp)】
正文:
? ? ? 客戶端
? ??網絡編程,離不開套接字,客戶端套接字編程需要了解和理解清楚5個部分
? ? ? 1、如何初始化套接字socket
? ? ? ? ? ??Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
? ? ? 2、如何有效的連接
? ? ? ? ?? s.Connect("192.168.1.100",2500);
? ? ? 3、發送過程
? ? ? ? ???既然哥在這里說是大文件,肯定回使用s.SendFile來處理發送過程,這也是解決大文件的好方法。
【聰明的同學】哦,原來還有這樣的方法,仔細閱讀MSDN才行。
【可愛的老師】當你發送文件給對方的時候,對方將會打開套接字等待你,那他怎么知道你究竟有多大呢?當不知道大小的情況下接收,會遇到很大的問題,很不方便我們處理。同學們說說,會有怎樣的問題啊?
【聰明的同學】1、不知道現在的空間能否存儲。2、套接字也不知道何時終止……老師怎么才能有效解決呢?
【可愛的老師】同學們,我在開始發送之前,把文件的大小,先告之對方,這樣就可以啦!
【聰明的同學】那采用多少前綴字節呢?如果沒有統一,到時候對方也不知道哪些是前綴,哪些是文件流?
【可愛的老師】在windows 中文件的大小是用long類型來描述的,也就是大致占有8個字節,所以WINDOWS的單獨文件大小不會超過2的64次方。于是,在發送大文件之前,統一前8個字節存放文件大小,插入在文件流的最前面,然后采用數據字節流,傳送給對方,對方首先也讀取前8個字節,了解大小后,開始讀取文件,并分析該盤符時候有空間給它存放。
【聰明的同學】老師你既然可以在前面加preStream,我是不是把我的文件名稱,大小,擴展名一起存放在lastStream一起發送。
【可愛的老師】真聰明!就是這樣處理。
? ? ? ? ??FileInfo fi = new FileInfo(filepath); ?filepath 一般指的是URL 例如:C:\A.JPG
? ? ? ? ??byte[] len = BitConverter.GetBytes(fi.Length);
s.SendFile(filepath,len,null,TransmitFileOptions.UseDefaultWorkerThread); s.Shutdown(SocketShutdown.Both); ? ? ??4、接收過程
? ? ? ? ???s.Receive來接收,在這里,哥會在詳細講解。
? ? ? 5、關閉套接字
??? ? ? ???s.close()
服務器
?服務器的套接字,就有所不同,它不是鏈接對方,而是等待,所以它需要綁定自己能夠提供服務的IP地址和相應的端口號,當等待的時候,會出現中斷。所以要考慮多線程。
現在主要是處理接收大文件的方法。先取出文件的大小。
byte[] buffer = new byte[8];? ? ? ? ? ? ? ?? s.Receive(buffer,8,0); long length = BitConverter.ToInt32(buffer, 0); ? 然后申請一個
??MemoryStream MS; 內存流,如果計算器還沒有計算到總數那么多,接著循環執行。?
? ? ? ? ? ? ? ?byte[] buf=new byte[8192];? while (count <length) { readcount =s.Receive(buf, buf.Length, 0);? MS.Write(buf, 0, readcount); count += readcount;
? ? ? ? ? ? ??}? 這樣,將把所要的流讀入了MS中,如果是圖片,可以直接使用Image.FromStream(MS)提供給pictureBox顯示,當然也可以使用。
MS.sava去保存你要的格式。
好,基本上講到這里。
轉載于:https://www.cnblogs.com/seemenlee/p/5389950.html
總結
- 上一篇: 使用Eclipse创建maven项目
- 下一篇: JavaScript开发中几个常用知识点