TCP/IP、Http、Soap都是基本的通讯协议。
通讯协议即网络中(包括互联网、局域网)传递、管理信息的一些规范。常见的协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议、SOAP协议等。在局域网中用得的比较多的是IPX/SPX。用户如果访问Internet,则必须在网络协议中添加TCP/IP协议。
TCP/IP是“transmission Control Protocol/Internet Protocol”的简写,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。TCP/IP是INTERNET的基础协议,也是一种电脑数据打包和寻址的标准方法.
假设服务器、实现网络通信(比如聊天),不管你是.NET还是其他,一定要了解TCP/IP。
在WEB编程中,服务端是指提供HTTP服务的部分,客户端是指你使用的浏览器。HTTP协议就是实现客户端和服务器端的通讯。简单说就是请求与响应,你提交了什么,返回个什么都可以在HTTP里规范。举个例子,
用户在WEB页上看到自己的客户端信息实际是HTTP的2次通讯。
SOAP(Simple Object Access Protocal,简单对象访问协议) 技术有助于实现大量异构程序和平台之间的互操作性,根据我有限的了解,SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。比如我们.NET中的WEB服务,就是基于SOAP
简单说就是这样,每一种通讯协议都很复杂
Code
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Net;
5
using System.Net.Sockets;
6
using System.Collections;
7
using System.IO;
8
using System.Text.RegularExpressions;
9
using RE = System.Text.RegularExpressions.Regex;
10
using System.Security.Cryptography.X509Certificates;
11
12
/**//***************************************************************************************************************************************************
13
* *文件名:HttpProc.cs
14
* *创建人:HeDaode
15
* *日 期:2007.09.01
16
* *描 述:实现HTTP协议中的GET、POST请求
17
* *使 用:HttpProc.WebClient client = new HttpProc.WebClient();
18
client.Encoding = System.Text.Encoding.Default;//默认编码方式,根据需要设置其他类型
19
client.OpenRead("http://www.baidu.com");//普通get请求
20
MessageBox.Show(client.RespHtml);//获取返回的网页源代码
21
client.DownloadFile("http://www.loopc.com/upload/163album.rar",@"C:/163album.rar");//下载文件
22
client.OpenRead("http://passport.baidu.com/?login","username=zhangsan&password=123456");//提交表单,此处是登录百度的示例
23
client.UploadFile("http://hiup.baidu.com/zhangsan/upload", @"file1=D:/1.mp3");//上传文件
24
client.UploadFile("http://hiup.baidu.com/zhangsan/upload", "folder=myfolder&size=4003550",@"file1=D:/1.mp3");//提交含文本域和文件域的表单
25
*****************************************************************************************************************************************************/
26
27
namespace HttpProc
28

{
29
/**////<summary>
30
///上传事件委托
31
///</summary>
32
///<param name="sender"></param>
33
///<param name="e"></param>
34
public delegate void WebClientUploadEvent(object sender, HttpProc.UploadEventArgs e);
35
36
/**////<summary>
37
///下载事件委托
38
///</summary>
39
///<param name="sender"></param>
40
///<param name="e"></param>
41
public delegate void WebClientDownloadEvent(object sender, HttpProc.DownloadEventArgs e);
42
43
44
/**////<summary>
45
///上传事件参数
46
///</summary>
47
public struct UploadEventArgs
48
{
49
/**////<summary>
50
///上传数据总大小
51
///</summary>
52
public long totalBytes;
53
/**////<summary>
54
///已发数据大小
55
///</summary>
56
public long bytesSent;
57
/**////<summary>
58
///发送进度(0-1)
59
///</summary>
60
public double sendProgress;
61
/**////<summary>
62
///发送速度Bytes/s
63
///</summary>
64
public double sendSpeed;
65
}
66
67
/**////<summary>
68
///下载事件参数
69
///</summary>
70
public struct DownloadEventArgs
71
{
72
/**////<summary>
73
///下载数据总大小
74
///</summary>
75
public long totalBytes;
76
/**////<summary>
77
///已接收数据大小
78
///</summary>
79
public long bytesReceived;
80
/**////<summary>
81
///接收数据进度(0-1)
82
///</summary>
83
public double ReceiveProgress;
84
/**////<summary>
85
///当前缓冲区数据
86
///</summary>
87
public byte[] receivedBuffer;
88
/**////<summary>
89
///接收速度Bytes/s
90
///</summary>
91
public double receiveSpeed;
92
}
93
94
/**////<summary>
95
///实现向WEB服务器发送和接收数据
96
///</summary>
97
public class WebClient
98
{
99
private WebHeaderCollection requestHeaders, responseHeaders;
100
private TcpClient clientSocket;
101
private MemoryStream postStream;
102
private Encoding encoding = Encoding.Default;
103
private const string BOUNDARY = "--HEDAODE--";
104
private const int SEND_BUFFER_SIZE = 10245;
105
private const int RECEIVE_BUFFER_SIZE = 10245;
106
private string cookie = "";
107
private string respHtml = "";
108
private string strRequestHeaders = "";
109
private string strResponseHeaders = "";
110
private int statusCode = 0;
111
private bool isCanceled = false;
112
public event WebClientUploadEvent UploadProgressChanged;
113
public event WebClientDownloadEvent DownloadProgressChanged;
114
115
/**////<summary>
116
///初始化WebClient类
117
///</summary>
118
public WebClient()
119
{
120
responseHeaders = new WebHeaderCollection();
121
requestHeaders = new WebHeaderCollection();
122
}
123
124
125
/**////<summary>
126
///读取指定URL的文本
127
///</summary>
128
///<param name="URL">请求的地址</param>
129
///<returns>服务器响应文本</returns>
130
public string OpenRead(string URL)
131
{
132
requestHeaders.Add("Connection", "close");
133
SendRequestData(URL, "GET");
134
return GetHtml();
135
}
136
137
138
//解决证书过期无法访问的问题
139
class CertPolicy : ICertificatePolicy
140
{
141
public bool CheckValidationResult(ServicePoint srvpt, X509Certificate cert, WebRequest req, int certprb)
142
{ return true; }
143
}
144
145
/**////<summary>
146
///采用https协议访问网络
147
///</summary>
148
///<param name="URL">url地址</param>
149
///<param name="strPostdata">发送的数据</param>
150
///<returns></returns>
151
public string OpenReadWithHttps(string URL, string strPostdata)
152
{
153
ServicePointManager.CertificatePolicy = new CertPolicy();
154
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
155
request.CookieContainer = new CookieContainer();
156
request.Method = "POST";
157
request.Accept = "*/*";
158
request.ContentType = "application/x-www-form-urlencoded";
159
byte[] buffer = this.encoding.GetBytes(strPostdata);
160
request.ContentLength = buffer.Length;
161
request.GetRequestStream().Write(buffer, 0, buffer.Length);
162
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
163
StreamReader reader = new StreamReader(response.GetResponseStream(), encoding);
164
this.respHtml = reader.ReadToEnd();
165
foreach (System.Net.Cookie ck in response.Cookies)
166
{
167
this.cookie += ck.Name + "=" + ck.Value + ";";
168
}
169
reader.Close();
170
return respHtml;
171
}
172
173
/**////<summary>
174
///读取指定URL的文本
175
///</summary>
176
///<param name="URL">请求的地址</param>
177
///<param name="postData">向服务器发送的文本数据</param>
178
///<returns>服务器响应文本</returns>
179
public string OpenRead(string URL, string postData)
180
{
181
byte[] sendBytes = encoding.GetBytes(postData);
182
postStream = new MemoryStream();
183
postStream.Write(sendBytes, 0, sendBytes.Length);
184
185
requestHeaders.Add("Content-Length", postStream.Length.ToString());
186
requestHeaders.Add("Content-Type", "application/x-www-form-urlencoded");
187
requestHeaders.Add("Connection", "close");
188
189
SendRequestData(URL, "POST");
190
return GetHtml();
191
}
192
193
194
/**////<summary>
195
///读取指定URL的流
196
///</summary>
197
///<param name="URL">请求的地址</param>
198
///<param name="postData">向服务器发送的数据</param>
199
///<returns>服务器响应流</returns>
200
public Stream GetStream(string URL, string postData)
201
{
202
byte[] sendBytes = encoding.GetBytes(postData);
203
postStream = new MemoryStream();
204
postStream.Write(sendBytes, 0, sendBytes.Length);
205
206
requestHeaders.Add("Content-Length", postStream.Length.ToString());
207
requestHeaders.Add("Content-Type", "application/x-www-form-urlencoded");
208
requestHeaders.Add("Connection", "close");
209
210
SendRequestData(URL, "POST");
211
212
MemoryStream ms = new MemoryStream();
213
SaveNetworkStream(ms);
214
return ms;
215
}
216
217
218
/**////<summary>
219
///上传文件到服务器
220
///</summary>
221
///<param name="URL">请求的地址</param>
222
///<param name="fileField">文件域(格式如:file1=C:/test.mp3&file2=C:/test.jpg)</param>
223
///<returns>服务器响应文本</returns>
224
public string UploadFile(string URL, string fileField)
225
{
226
return UploadFile(URL, "", fileField);
227
}
228
229
/**////<summary>
230
///上传文件和数据到服务器
231
///</summary>
232
///<param name="URL">请求地址</param>
233
///<param name="textField">文本域(格式为:name1=value1&name2=value2)</param>
234
///<param name="fileField">文件域(格式如:file1=C:/test.mp3&file2=C:/test.jpg)</param>
235
///<returns>服务器响应文本</returns>
236
public string UploadFile(string URL, string textField, string fileField)
237
{
238
postStream = new MemoryStream();
239
240
if (textField != "" && fileField != "")
241
{
242
WriteTextField(textField);
243
WriteFileField(fileField);
244
}
245
else if (fileField != "")
246
{
247
WriteFileField(fileField);
248
}
249
else if (textField != "")
250
{
251
WriteTextField(textField);
252
}
253
else
254
throw new Exception("文本域和文件域不能同时为空。");
255
256
//写入结束标记
257
byte[] buffer = encoding.GetBytes("--" + BOUNDARY + "--/r/n");
258
postStream.Write(buffer, 0, buffer.Length);
259
260
//添加请求标头
261
requestHeaders.Add("Content-Length", postStream.Length.ToString());
262
requestHeaders.Add("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
263
requestHeaders.Add("Connection", "Keep-Alive");
264
265
//发送请求数据
266
SendRequestData(URL, "POST", true);
267
268
//返回响应文本
269
return GetHtml();
270
}
271
272
273
/**////<summary>
274
///分析文本域,添加到请求流
275
///</summary>
276
///<param name="textField">文本域</param>
277
private void WriteTextField(string textField)
278
{
279
string[] strArr = RE.Split(textField, "&");
280
textField = "";
281
foreach (string var in strArr)
282
{
283
Match M = RE.Match(var, "([^=]+)=(.+)");
284
textField += "--" + BOUNDARY + "/r/n";
285
textField += "Content-Disposition: form-data; name=/"" + M.Groups[1].Value + "/"/r/n/r/n" + M.Groups[2].Value + "/r/n";
286
}
287
byte[] buffer = encoding.GetBytes(textField);
288
postStream.Write(buffer, 0, buffer.Length);
289
}
290
291
/**////<summary>
292
///分析文件域,添加到请求流
293
///</summary>
294
///<param name="fileField">文件域</param>
295
private void WriteFileField(string fileField)
296
{
297
string filePath = "";
298
int count = 0;
299
string[] strArr = RE.Split(fileField, "&");
300
foreach (string var in strArr)
301
{
302
Match M = RE.Match(var, "([^=]+)=(.+)");
303
filePath = M.Groups[2].Value;
304
fileField = "--" + BOUNDARY + "/r/n";
305
fileField += "Content-Disposition: form-data; name=/"" + M.Groups[1].Value + "/"; filename=/"" + Path.GetFileName(filePath) + "/"/r/n";
306
fileField += "Content-Type: image/jpeg/r/n/r/n";
307
308
byte[] buffer = encoding.GetBytes(fileField);
309
postStream.Write(buffer, 0, buffer.Length);
310
311
//添加文件数据
312
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
313
buffer = new byte[50000];
314
315
do
316
{
317
count = fs.Read(buffer, 0, buffer.Length);
318
postStream.Write(buffer, 0, count);
319
320
} while (count > 0);
321
322
fs.Close();
323
fs.Dispose();
324
fs = null;
325
326
buffer = encoding.GetBytes("/r/n");
327
postStream.Write(buffer, 0, buffer.Length);
328
}
329
}
330
331
/**////<summary>
332
///从指定URL下载数据流
333
///</summary>
334
///<param name="URL">请求地址</param>
335
///<returns>数据流</returns>
336
public Stream DownloadData(string URL)
337
{
338
requestHeaders.Add("Connection", "close");
339
SendRequestData(URL, "GET");
340
MemoryStream ms = new MemoryStream();
341
SaveNetworkStream(ms, true);
342
return ms;
343
}
344
345
346
/**////<summary>
347
///从指定URL下载文件
348
///</summary>
349
///<param name="URL">文件URL地址</param>
350
///<param name="fileName">文件保存路径,含文件名(如:C:/test.jpg)</param>
351
public void DownloadFile(string URL, string fileName)
352
{
353
requestHeaders.Add("Connection", "close");
354
SendRequestData(URL, "GET");
355
FileStream fs = new FileStream(fileName, FileMode.Create);
356
SaveNetworkStream(fs, true);
357
fs.Close();
358
fs = null;
359
}
360
361
/**////<summary>
362
///向服务器发送请求
363
///</summary>
364
///<param name="URL">请求地址</param>
365
///<param name="method">POST或GET</param>
366
///<param name="showProgress">是否显示上传进度</param>
367
private void SendRequestData(string URL, string method, bool showProgress)
368
{
369
clientSocket = new TcpClient();
370
Uri URI = new Uri(URL);
371
clientSocket.Connect(URI.Host, URI.Port);
372
373
requestHeaders.Add("Host", URI.Host);
374
byte[] request = GetRequestHeaders(method + " " + URI.PathAndQuery + " HTTP/1.1");
375
clientSocket.Client.Send(request);
376
377
//若有实体内容就发送它
378
if (postStream != null)
379
{
380
byte[] buffer = new byte[SEND_BUFFER_SIZE];
381
int count = 0;
382
Stream sm = clientSocket.GetStream();
383
postStream.Position = 0;
384
385
UploadEventArgs e = new UploadEventArgs();
386
e.totalBytes = postStream.Length;
387
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();//计时器
388
timer.Start();
389
do
390
{
391
//如果取消就推出
392
if (isCanceled)
{ break; }
393
394
//读取要发送的数据
395
count = postStream.Read(buffer, 0, buffer.Length);
396
//发送到服务器
397
sm.Write(buffer, 0, count);
398
399
//是否显示进度
400
if (showProgress)
401
{
402
//触发事件
403
e.bytesSent += count;
404
e.sendProgress = (double)e.bytesSent / (double)e.totalBytes;
405
double t = timer.ElapsedMilliseconds / 1000;
406
t = t <= 0 ? 1 : t;
407
e.sendSpeed = (double)e.bytesSent / t;
408
if (UploadProgressChanged != null)
{ UploadProgressChanged(this, e); }
409
}
410
411
} while (count > 0);
412
timer.Stop();
413
postStream.Close();
414
//postStream.Dispose();
415
postStream = null;
416
417
}//end if
418
419
}
420
421
/**////<summary>
422
///向服务器发送请求
423
///</summary>
424
///<param name="URL">请求URL地址</param>
425
///<param name="method">POST或GET</param>
426
private void SendRequestData(string URL, string method)
427
{
428
SendRequestData(URL, method, false);
429
}
430
431
432
/**////<summary>
433
///获取请求头字节数组
434
///</summary>
435
///<param name="request">POST或GET请求</param>
436
///<returns>请求头字节数组</returns>
437
private byte[] GetRequestHeaders(string request)
438
{
439
requestHeaders.Add("Accept", "*/*");
440
requestHeaders.Add("Accept-Language", "zh-cn");
441
requestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
442
443
string headers = request + "/r/n";
444
445
foreach (string key in requestHeaders)
446
{
447
headers += key + ":" + requestHeaders[key] + "/r/n";
448
}
449
450
//有Cookie就带上Cookie
451
if (cookie != "")
{ headers += "Cookie:" + cookie + "/r/n"; }
452
453
//空行,请求头结束
454
headers += "/r/n";
455
456
strRequestHeaders = headers;
457
requestHeaders.Clear();
458
return encoding.GetBytes(headers);
459
}
460
461
462
463
/**////<summary>
464
///获取服务器响应文本
465
///</summary>
466
///<returns>服务器响应文本</returns>
467
private string GetHtml()
468
{
469
MemoryStream ms = new MemoryStream();
470
SaveNetworkStream(ms);//将网络流保存到内存流
471
StreamReader sr = new StreamReader(ms, encoding);
472
respHtml = sr.ReadToEnd();
473
sr.Close();
474
ms.Close();
475
return respHtml;
476
}
477
478
/**////<summary>
479
///将网络流保存到指定流
480
///</summary>
481
///<param name="toStream">保存位置</param>
482
///<param name="needProgress">是否显示进度</param>
483
private void SaveNetworkStream(Stream toStream, bool showProgress)
484
{
485
//获取要保存的网络流
486
NetworkStream NetStream = clientSocket.GetStream();
487
488
byte[] buffer = new byte[RECEIVE_BUFFER_SIZE];
489
int count = 0, startIndex = 0;
490
491
MemoryStream ms = new MemoryStream();
492
for (int i = 0; i < 3; i++)
493
{
494
count = NetStream.Read(buffer, 0, 500);
495
ms.Write(buffer, 0, count);
496
}
497
498
if (ms.Length == 0)
{ NetStream.Close(); throw new Exception("远程服务器没有响应"); }
499
500
buffer = ms.GetBuffer();
501
count = (int)ms.Length;
502
503
GetResponseHeader(buffer, out startIndex);//分析响应,获取响应头和响应实体
504
count -= startIndex;
505
toStream.Write(buffer, startIndex, count);
506
507
DownloadEventArgs e = new DownloadEventArgs();
508
509
if (responseHeaders["Content-Length"] != null)
510
{ e.totalBytes = long.Parse(responseHeaders["Content-Length"]); }
511
else
512
{ e.totalBytes = -1; }
513
514
//启动计时器
515
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
516
timer.Start();
517
518
do
519
{
520
//如果取消就推出
521
if (isCanceled)
{ break; }
522
523
//显示下载进度
524
if (showProgress)
525
{
526
e.bytesReceived += count;
527
e.ReceiveProgress = (double)e.bytesReceived / (double)e.totalBytes;
528
529
byte[] tempBuffer = new byte[count];
530
Array.Copy(buffer, startIndex, tempBuffer, 0, count);
531
e.receivedBuffer = tempBuffer;
532
533
double t = (timer.ElapsedMilliseconds + 0.1) / 1000;
534
e.receiveSpeed = (double)e.bytesReceived / t;
535
536
startIndex = 0;
537
if (DownloadProgressChanged != null)
{ DownloadProgressChanged(this, e); }
538
}
539
540
//读取网路数据到缓冲区
541
count = NetStream.Read(buffer, 0, buffer.Length);
542
543
//将缓存区数据保存到指定流
544
toStream.Write(buffer, 0, count);
545
} while (count > 0);
546
547
timer.Stop();//关闭计时器
548
549
if (responseHeaders["Content-Length"] != null)
550
{
551
toStream.SetLength(long.Parse(responseHeaders["Content-Length"]));
552
}
553
//else
554
//{
555
// toStream.SetLength(toStream.Length);
556
// responseHeaders.Add("Content-Length", toStream.Length.ToString());//添加响应标头
557
//}
558
559
toStream.Position = 0;
560
561
//关闭网络流和网络连接
562
NetStream.Close();
563
clientSocket.Close();
564
}
565
566
567
/**////<summary>
568
///将网络流保存到指定流
569
///</summary>
570
///<param name="toStream">保存位置</param>
571
private void SaveNetworkStream(Stream toStream)
572
{
573
SaveNetworkStream(toStream, false);
574
}
575
576
577
578
/**////<summary>
579
///分析响应流,去掉响应头
580
///</summary>
581
///<param name="buffer"></param>
582
private void GetResponseHeader(byte[] buffer, out int startIndex)
583
{
584
responseHeaders.Clear();
585
string html = encoding.GetString(buffer);
586
StringReader sr = new StringReader(html);
587
588
int start = html.IndexOf("/r/n/r/n") + 4;//找到空行位置
589
strResponseHeaders = html.Substring(0, start);//获取响应头文本
590
591
//获取响应状态码
592
//
593
if (sr.Peek() > -1)
594
{
595
//读第一行字符串
596
string line = sr.ReadLine();
597
598
//分析此行字符串,获取服务器响应状态码
599
Match M = RE.Match(line, @"/d/d/d");
600
if (M.Success)
601
{
602
statusCode = int.Parse(M.Value);
603
}
604
}
605
606
//获取响应头
607
//
608
while (sr.Peek() > -1)
609
{
610
//读一行字符串
611
string line = sr.ReadLine();
612
613
//若非空行
614
if (line != "")
615
{
616
//分析此行字符串,获取响应标头
617
Match M = RE.Match(line, "([^:]+):(.+)");
618
if (M.Success)
619
{
620
try
621
{ //添加响应标头到集合
622
responseHeaders.Add(M.Groups[1].Value.Trim(), M.Groups[2].Value.Trim());
623
}
624
catch
625
{ }
626
627
628
//获取Cookie
629
if (M.Groups[1].Value == "Set-Cookie")
630
{
631
M = RE.Match(M.Groups[2].Value, "[^=]+=[^;]+");
632
cookie += M.Value.Trim() + ";";
633
}
634
}
635
636
}
637
//若是空行,代表响应头结束响应实体开始。(响应头和响应实体间用一空行隔开)
638
else
639
{
640
//如果响应头中没有实体大小标头,尝试读响应实体第一行获取实体大小
641
if (responseHeaders["Content-Length"] == null && sr.Peek() > -1)
642
{
643
//读响应实体第一行
644
line = sr.ReadLine();
645
646
//分析此行看是否包含实体大小
647
Match M = RE.Match(line, "~[0-9a-fA-F]{1,15}");
648
649
if (M.Success)
650
{
651
//将16进制的实体大小字符串转换为10进制
652
int length = int.Parse(M.Value, System.Globalization.NumberStyles.AllowHexSpecifier);
653
responseHeaders.Add("Content-Length", length.ToString());//添加响应标头
654
strResponseHeaders += M.Value + "/r/n";
655
}
656
}
657
break;//跳出循环
658
}//End If
659
}//End While
660
661
sr.Close();
662
663
//实体开始索引
664
startIndex = encoding.GetBytes(strResponseHeaders).Length;
665
}
666
667
668
/**////<summary>
669
///取消上传或下载,要继续开始请调用Start方法
670
///</summary>
671
public void Cancel()
672
{
673
isCanceled = true;
674
}
675
676
/**////<summary>
677
///启动上传或下载,要取消请调用Cancel方法
678
///</summary>
679
public void Start()
680
{
681
isCanceled = false;
682
}
683
684
//*************************************************************
685
//以下为属性
686
//*************************************************************
687
688
/**////<summary>
689
///获取或设置请求头
690
///</summary>
691
public WebHeaderCollection RequestHeaders
692
{
693
set
{ requestHeaders = value; }
694
get
{ return requestHeaders; }
695
}
696
697
/**////<summary>
698
///获取响应头集合
699
///</summary>
700
public WebHeaderCollection ResponseHeaders
701
{
702
get
{ return responseHeaders; }
703
}
704
705
/**////<summary>
706
///获取请求头文本
707
///</summary>
708
public string StrRequestHeaders
709
{
710
get
{ return strRequestHeaders; }
711
}
712
713
/**////<summary>
714
///获取响应头文本
715
///</summary>
716
public string StrResponseHeaders
717
{
718
get
{ return strResponseHeaders; }
719
}
720
721
/**////<summary>
722
///获取或设置Cookie
723
///</summary>
724
public string Cookie
725
{
726
set
{ cookie = value; }
727
get
{ return cookie; }
728
}
729
730
/**////<summary>
731
///获取或设置编码方式(默认为系统默认编码方式)
732
///</summary>
733
public Encoding Encoding
734
{
735
set
{ encoding = value; }
736
get
{ return encoding; }
737
}
738
739
/**////<summary>
740
///获取服务器响应文本
741
///</summary>
742
public string RespHtml
743
{
744
get
{ return respHtml; }
745
}
746
747
748
/**////<summary>
749
///获取服务器响应状态码
750
///</summary>
751
public int StatusCode
752
{
753
get
{ return statusCode; }
754
}
755
}
756
}
757