.Net培训个人总结笔记8

学习交流,欢迎转载。转载请注明文章来源:http://www.cnblogs.com/lgjspace/archive/2011/10/12/2213014.html

常识:
网址有多种形式,如:“http://www.baidu.com.cn/”、“ftp://a/b/*.rar”等。

 

细节:
WebRequest 类是抽象类,要创建 WebRequest 类的实例,必须通过调用 WebRequest 类的静态方法 Create() 来实现。WebRequest.Create() 方法的返回值也是 WebRequest 类型, 其实这里不是返回 WebRequest 类自己本身,而是返回 WebRequest 类的派生类的实例,WebRequest 类的派生类常见的包括:HttpWebRequest,FtpWebRequest,FileWebRequest。至于返回哪一个派生类的实例,就取决于传进 Create() 方法中的参数值到底是哪一种地址(Http、ftp、file)。

 

细节:
WebRequest request = WebRequest.Create("http://www.baidu.com.cn/");
WebResponse response = request.GetResponse();
注意:执行到第二句后“等待服务器响应”的时候程序会被阻塞在这里(类似于执行“MessageBox.Show()”时被挡住不能跳过该对话框进行后续操作的效果),这是因为 request.GetResponse() 方法要等服务器返回响应的结果后才能把服务器的响应结果赋值给 response 变量,这时期服务器端会有不能确定的延时现象,所以代码必须得停在这里,等服务器的响应完成,出现假死现象。

 

细节:
System.TextEncoding命名空间下提供了常见的编码操作。其中的 Default 属性是让程序自动识别目标文本的编码类型。

 

重点:
默认的 http 协议传输的编码规则是 UTF-8。

 

经验:
写项目时首先要考虑现有技术能不能够实现该项目的主要关键功能。

 

细节:
1. WebClient 类在提交请求的时候实际上是利用了 WebRequest 类。
2. WebClient 类中凡是带有“Download”前缀的都是用来下载数据的;凡是带有“Upload”前缀的都是用来上传数据的。
3. 同时,凡是带有“Download”或“Upload”前缀的都是一些可控性不是很灵活的方法。
4. WebClient 类中的 OpenRead() 和 OpenWrite() 方法是比较底层的方法,前者是下载时用的,后者是上传时用的。

 

技巧:
在 VisualStudio 中,把一个名字提取为方法的快捷方法是:“Ctrl + R + M”。
其实很多快捷方式都可以尝试推导(虽然不一定100%准确),通过右键菜单可以看到“重构”选项的快捷键为“Ctrl + R”,而该该选项的子选项中所有的选项的快捷键都包含父级菜单的快捷键“Ctrl + R”,然后再加上自己名字相关的字母(一般是这样)即便成了该选项的快捷键。

 

细节:
上网时,网页上的网址最终都被转换成IP地址。

 

重点:
1.Socket 中有两个基础元素:IP,端口(整型数),TCP 协议是由 IP 地址和端口号来唯一地识别确认连接并传输数据的。
2.在网站配置端口为80时可以省略掉端口号不写,一旦端口号改了不是80,则必须加上端口号。配置端口号可以在IIS上配置(如果服务器是IIS的话)。

 

细节:
源端口一般是一个随机的端口号,而目标端口一般不是随机的,而要根据客户机所要请求的服务来决定。
例如:
服务器    端口号
FTP      21
Telent      23
SMTP     25
HTTP     80
POP3       110
(另外,还有 4000 是 OICQ 端口,6667 是 IRC 端口)
一般来说,保留端口是一个小于 1024 的数,端口的最大号小于 65535。因此,自己写的 Socket 一般建议端口号设在 1024 到 65535 之间。

 

细节:
网络编程有:基于TCP方式的编程、基于UDP方式的编程。
TCP方式是面向连接的方式,需要三次握手,类似于“打电话”,只要对方没有拿起电话,通信就不能成功。TCP方式优点是安全,但缺点是慢,消耗性能资源。
UDP方式是非面向连接的方式,类似于“寄信”,信寄了出去就不管收信的人有没有收到了。UDP方式优点是速度快,但缺点是有“丢包”的现象。比较适合于视频、语音等的网络播放等。

 

重点:
服务器端必须得要有一个“侦听请求”的实时操作,该操作通过死循环来实现“实时”的效果,正在“侦听”的时候程序处在“阻塞”状态,以达到“不停地等待着用户发过来的请求”的效果。

 

常识:
一般来说,TCP服务器端的IP地址和端口号是对外公布且已知的,但客户端的IP地址和端口号在服务器接收到用户发出的请求之前一定是未知的。

 

细节:
实时侦听的原理:
一旦客户端的请求被服务器端接收到,让服务器端知道该客户端已和服务器端自身连接上之后,服务器端的“侦听”线程会把接收到的用户连接转移到另一个线程来独立处理,而自己则继续“侦听”。

 

细节:
普通用户的IP地址一般都是由最外围的路由设备动态分配的。

 

细节:
负责和某一个用户进行通信的模块就叫做 Session。

 

细节:
在服务器端和客户端都有“死循环”的机制,服务器端的死循环相当于酒店的“迎宾小姐”,专门负责等待着客户端的请求;而客户端的死循环是出现在发出请求之后请求服务器响应但还没有收到服务器的响应这个时间段里的;两个死循环都会出现“阻塞”的效果。

 

细节:
客户端之间也是通过“服务器中转”的方式来进行通讯的。

 

细节:
TCPListener 类是服务器的监听类,提供了相当于“死循环”的“实时监听”的功能,不断等待用户的请求。
要用Socket建立一个TCP服务器程序,一般需要以下几个步骤:
(1)创建一个服务器套接字(Socket),利用IP地址和端口号初始化服务器:
 IPAddress ipAdd = IPAddress.Parse("210.77.26.37");
 TcpListener listener = new TcpListener(ipAdd,1234);
(2)打开监听器来监听服务器端口:
 Listener.Start();
(3)确认与客户端的连接:
 Socket socket = listener.AcceptSocket();
(4)处理客户端的请求并回应客户端,下面的代码演示了向客户端发送字符串:
 String message = "Hello!";
 Byte[] ouebytes = System.Text.Encoding.Unicode.GetBvtes(message);
 Socket.Send(outbytes, ouebytes.Length, 0);
(5)断开客户端的连接,释放客户端连接:
 Socket.Close();
(6)关闭服务器,释放服务器连接:
 Listener.Close();

 

技巧:
在VS中,红色下划线代表的是语法错误。

 

细节:
关于 Socket 类的 Receive() 方法的官方描述:
如果您使用的是面向连接的协议,则在调用 Receive 之前,必须调用 Connect 以建立远程主机连接,或者调用 Accept 以接受传入的连接。 Receive 方法只读取在 Connect 或 Accept 方法中建立的远程主机发送的数据。 如果您使用的是无连接协议,则您也可以使用 ReceiveFrom 方法。 ReceiveFrom 将允许您收到从任何主机传入的数据。

 

细节:
在C#中的所有字符都是 Unicode 编码类型的。
ASCII是用一个字节(中的 7 位)来表示一个字符,而 Unicode 是用两个字节表示一个字符。

 

重点:!!
1. NetworkStream 流的 Read(buffer, 0, buffer.Length) 方法在没有接收到远程连接端发送过来的任何流信息之前,该 Read 方法是会停在这不会往下走的(类似于阻塞状态)。
2. 这样的现象(没有收到信息之前会一直阻塞在那里直到收到信息之后才会继续往下执行的现象)同样也出现在 Socket 类中的 Receive() 方法中。

 

经验:
ThreadPool.QueueUserWorkItem(new WaitCallback(HodingClientsReceive), socket);
这里的 HodingClientsReceive 是要被 WaitCallback 调用的回调函数名,而 socket 则是要传递给函数 HodingClientsReceive 的参数。

posted @ 2011-10-12 23:12  梁国锦  阅读(254)  评论(0编辑  收藏  举报