C# 網路程式設計練習
阿新 • • 發佈:2018-12-02
1 把網路圖片轉化為Image,獲取網路圖片直接stream轉化
private Image ImageFromWeb(String url ) { //獲取HttpWebRequest物件 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); //獲取返回流 WebResponse response = request.GetResponse(); //把流轉化為圖片 Image img = Image.FromStream(response.GetResponseStream()); return img; }
2網路請求總結,方法1,直接利用StreamReader,讀取所有資料,獲取字串
private void SimpleeePost(String url,string param) { HttpWebRequest request =(HttpWebRequest) WebRequest.Create(url); HttpWebResponse response; byte[] bs = Encoding.ASCII.GetBytes(param); Stream stream; using (Stream reqStream = request.GetRequestStream()) { reqStream.Write(bs,0,bs.Length); } using (response = (HttpWebResponse)request.GetResponse()) { using (stream = response.GetResponseStream()) { StreamReader reader = new StreamReader(stream); string responseFromServer = reader.ReadToEnd(); } } }
3 將stream網路流直接轉化為byte[]
public static byte[] StreamToBytes(Stream reader) { using (MemoryStream ms = new MemoryStream()) { byte[] buffer = new byte[1024]; int actual = 0; //從網路流讀取資料到位元組,如果有資料就讀取 while ((actual = ms.Read(buffer, 0, 1024)) > 0) { //從位元組流寫入記憶體流 ms.Write(buffer, 0, actual); } byte[] picbytes = ms.ToArray(); return picbytes; } }
檔案流的應用:
一. 二進位制轉換成圖片
MemoryStream ms = new MemoryStream(bytes);
Image img = Image.FromStream(ms);
二. C#中byte[]與string的轉換程式碼
1、System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();
byte[] inputBytes =converter.GetBytes(inputString);
string inputString = converter.GetString(inputBytes);
2、string inputString = System.Convert.ToBase64String(inputBytes);
byte[] inputBytes = System.Convert.FromBase64String(inputString);
System.Text.UnicodeEncoding.UTF8.GetBytes()
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
三. C# Stream 和 byte[] 之間的轉換
/// 將 Stream 轉成 byte[]
public byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 設定當前流的位置為流的開始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
/// 將 byte[] 轉成 Stream
public Stream BytesToStream(byte[] bytes)
{
Stream stream = new MemoryStream(bytes);
return stream;
}
四. Stream 和 檔案之間的轉換
將 Stream 寫入檔案
public void StreamToFile(Stream stream,string fileName)
{
// 把 Stream 轉換成 byte[]
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 設定當前流的位置為流的開始
stream.Seek(0, SeekOrigin.Begin);
// 把 byte[] 寫入檔案
FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(bytes);
bw.Close();
fs.Close();
}
五. 從檔案讀取 Stream
public Stream FileToStream(string fileName)
{
// 開啟檔案
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
// 讀取檔案的 byte[]
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();
// 把 byte[] 轉換成 Stream
Stream stream = new MemoryStream(bytes);
return stream;
}
利用幫助類httpHelper,httpitem設定更多資訊模擬網路請求,實質還是利用HttpWebRequest發起請求
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = "http://www.sufeinet.com",//URL 必需項
Encoding = null,//編碼格式(utf-8,gb2312,gbk) 可選項 預設類會自動識別
//Encoding = Encoding.Default,
Method = "get",//URL 可選項 預設為Get
Timeout = 100000,//連線超時時間 可選項預設為100000
ReadWriteTimeout = 30000,//寫入Post資料超時時間 可選項預設為30000
IsToLower = false,//得到的HTML程式碼是否轉成小寫 可選項預設轉小寫
Cookie = "",//字串Cookie 可選項
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",//使用者的瀏覽器型別,版本,作業系統 可選項有預設值
Accept = "text/html, application/xhtml+xml, */*",// 可選項有預設值
ContentType = "text/html",//返回型別 可選項有預設值
Referer = "http://www.sufeinet.com",//來源URL 可選項
Allowautoredirect = true,//是否根據301跳轉 可選項
CerPath = "d:\\123.cer",//證書絕對路徑 可選項不需要證書時可以不寫這個引數
Connectionlimit = 1024,//最大連線數 可選項 預設為1024
Postdata = "C:\\PERKYSU_20121129150608_ScrubLog.txt",//Post資料 可選項GET時不需要寫
PostDataType = PostDataType.FilePath,//預設為傳入String型別,也可以設定PostDataType.Byte傳入Byte型別資料
ProxyIp = "192.168.1.105:8015",//代理伺服器ID 埠可以直接加到後面以:分開就行了 可選項 不需要代理 時可以不設定這三個引數
ProxyPwd = "123456",//代理伺服器密碼 可選項
ProxyUserName = "administrator",//代理伺服器賬戶名 可選項
ResultType = ResultType.Byte,//返回資料型別,是Byte還是String
PostdataByte = System.Text.Encoding.Default.GetBytes("測試一下"),//如果PostDataType為Byte時要設定本屬性的值
CookieCollection = new System.Net.CookieCollection(),//可以直接傳一個Cookie集合進來
};
item.Header.Add("測試Key1", "測試Value1");
item.Header.Add("測試Key2", "測試Value2");
//得到HTML程式碼
HttpResult result = http.GetHtml(item);
//取出返回的Cookie
string cookie = result.Cookie;
//返回的Html內容
string html = result.Html;
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
//表示訪問成功,具體的大家就參考HttpStatusCode類
}
//表示StatusCode的文字說明與描述
string statusCodeDescription = result.StatusDescription;
//把得到的Byte轉成圖片
Image img = byteArrayToImage(result.ResultByte);
}
/// <summary>
/// 位元組陣列生成圖片
/// </summary>
/// <param name="Bytes">位元組陣列</param>
/// <returns>圖片</returns>
private Image byteArrayToImage(byte[] Bytes)
{
MemoryStream ms = new MemoryStream(Bytes);
Image outputImg = Image.FromStream(ms);
return outputImg;
}}
設定安全協議
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
//直接確認,不然打不開
return true;
}
對於流要關閉,close,dispose,using,個人理解
參考文件: