多線程與Socket編程


一、死鎖

  定義:

指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。 由於資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象:死鎖.

 解決辦法:

   1.有序資源分配法

    申請不同類資源時,必須按各類設備的編號依次申請

   2 .銀行家算法

   檢查申請者對資源的最大需求量,如果系統現存的各類資源可以滿足申請者的請求,就滿足申請者的請求。

 

二、線程池ThreadPool

可用於發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。線程池允許在后台運行多個工作,而不需要為每個任務頻繁地創建和銷毀單獨的線程,從而減少了開銷.

*注意*

線程池中的線程都是后台線程

不能手動設置每個線程的屬性,比如設置為前台線程、優先級等等

當執行一些比較短的任務是考慮使用線程池,長時間執行的任務不要使用線程池來創建,而要使用Thread手動創建一個線程。

 

 

三、委托的異步調用

BeginInvoke  異步調用,BeginInvoke(被調用的方法的參數,回調函數,回調函數的參數);

EndInvoke     獲取異步調用的(方法)返回值

IAsyncResult  異步操作的狀態

AsyncResult   異步操作的結果(可以獲取當前執行的委托對象)

using System.Runtime.Remoting.Messaging;

AsyncState獲取回調函數的參數。

注意:委托的異步調用只對單播委托\

 

四、網絡協議

網絡五層:應用層、傳輸層、網絡層、鏈路層、物理層。一般因特網現在都是用的是五層協議,把表示層與會話層的功能都交給了具體的應用程序來做了。

網絡七層:應用層、表示層、會話層、傳輸層、網絡層、鏈路層、物理層

1.應用層:(HTTP、FTP、SMTP)報文Message

2.表示層:通信的應用程序能夠解釋交換數據的含義。數據壓縮、加密解密、數據描述等。

3..會話層:定義了數據交換的定界、同步、建立檢查點等功能,例如如何開始、控制結束一個會話。保證接收消息的連續性,完整性。

4.傳輸層(TCP、UDP)報文段Segment,為運行在不同主機上的應用程序進程間提供數據傳輸服務。通過套接字(Socket)實現。

   a>TCP(傳輸控制協議)面向連接的、可靠(應用:ftp、smtp、http等都是基於tcp)

   B>UDP(用戶數據報協議)無連接的、不可靠的(數據報)應用:視頻會議、網絡電話、DNS解析。(速度快,能容忍部分數據丟失)

5.網絡層(IP)數據報datagram,把數據從一台主機移動到另一台主機,主機間通信。IP協議不可靠,有丟包。

6.鏈路層(以太網、WiFi、點對點)幀Frame,負責將數據報傳遞給下一個節點。不同的鏈路層有特定的鏈路層協議。一系列路由器、交換機。

7.物理層:負責把數據一個bit一個bit的從一個節點移動到下一個節點,該層中的協議仍然與鏈路層相關。例如,以太網具有許多物理層協議:雙絞銅線的、同軸電纜的、光纖的。

網絡簡單的四層

應用層 (Application):應用層是個很廣泛的概念,有一些基本相同的系統級 TCP/IP 應用以及應用協議,也有許多的企業商業應用和互聯網應用。

傳輸層 (Transport):傳輸層包括 UDP 和 TCP,UDP 幾乎不對報文進行檢查,而 TCP 提供傳輸保證。

網絡層 (Network):網絡層協議由一系列協議組成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。

鏈路層 (Link):又稱為物理數據網絡接口層,負責報文傳輸。

 

網絡層協議

TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,需要建立連接(像手機)

UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議,只管發送(像電報)。它是屬於TCP/IP協議族中的一種。

TCP/IP 連接需要三次握手

1.確定a能發給b

2.b告訴a接受能破解,b能發給a數據

3.a告訴b能破解

端口

1.用來修飾同一地址內的,不同的程序的

2.一個端口同以時間只能被一個程序所監聽

3.一個程序綁定一個獨有的端口

socket

socket的英文原義是“孔”或“插座”。作為進程通信機制,取后一種意思。通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。(其實就是兩個程序通信用的。),是對網絡層的抽象,方便客戶端和服務端的傳輸

1.定義:進程通信機制,通常稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。

2.端口范圍:0-65535之間。端口的意義:用來區分不同的進程。

   分類

  (1)公認端口:(Well Known Ports):從0到1023,它們緊密綁定(binding)於一些服務。通常這些端口的通訊 明確表明了某種服務的協議。例如:80端口實際上總是HTTP通訊,ftp21,smtp25,....。

(2)注冊端口(Registered Ports):從1024到49151。它們松散地綁定於一些服務。也就是說有許多服務綁定於 這些端口,這些端口同樣用於許多其它目的。例如:許多系統處理動態端口從1024左右開始。

(3)動態和/或私有端口(Dynamic and/or Private Ports):從49152到65535。理論上,不應為服務分配這些端 口。實際上,機器通常從1024起分配動態端口。但也有例外:SUN的RPC端口從32768開始。

3.兩種類型:

    a.流式Socket(STREAM):        是一種面向連接的Socket,針對於面向連接的TCP服務應用,安全,但是效率         低;發送數據是以流的方式,發送方可以有自己的緩沖區大小,接收方也可以有自己的緩沖區大小,不必一致,只要發送的數據都接收到就可以了。一次發10個字節,發3次。接收方一次接6個字節,接5 次。只要保證最后是完整的就可以。

b.數據報式Socket(DATAGRAM): 是一種無連接的Socket,對應於無連接的UDP服務應用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高.發送方每次發送一個數據報,接收方必須一次也接收一個完整的數據報。

創建和使用socket

    //第一步:創建socket:第一個參數:設置網絡層的協議,第二個參數設置傳輸數據的方式,第三個參數:傳輸層的協議

      Socket listenSocket=new Socket(AddressFamily.InterNetwor,SocketType.Stream,ProtocolTypt.Tcp);

    //第二步:綁定一個端口和Ip地址

    //根據字符串創建一個ip地址對象

    IpAddress ip=IpAddress.parse(this.txtIp.Text);//127.0.0.1

     //創建一個節點

      IpEndpoint endpoint =new IpEndpoint(ip,int.Parse(this.txtport.Text));

        listenSocket.Bind(endpoint);

     //第三步:開始監聽端口

      listensocket.Listen(10);//連接隊列的最大數

    //第四步:開始接受用戶的連接

    //Accept會阻塞主線程,直到客戶端連接上來后,方法執行完成並返回代理Socket

    Socket proxSocket=listenSocket.Accept();

    //給客戶端傳輸一個字符串

     var  buffer =Encoding.Default.GetBytes("asdf ");

      proxSocket.Send(buffer);

 

六、Socket編程模型

服務器端:

1.創建Socket對象。設置協議、傳輸方式等(連接Socket)

2.綁定IP與端口(設置要監聽的IP與端口)。Bind()

3.開啟監聽。Listen()

4.開始接受客戶端連接。Accept();//阻塞線程,同時也需要循環不斷接受用戶連接。

5.接受了客戶端的連接,生成一個新的Socket對象(通信Socket)

6.接受(Receive)和發送(Send)消息//需要循環不斷接收用戶的消息

7.Shutdown()禁用發送與接收功能。

8.Close()關閉釋放資源

客戶端:

1.創建Socket對象。設置協議、傳輸方式等(連接Socket)

2.Connect()連接服務器(IP與端口)

3.向服務器發送、接受消息

4.Shutdown()禁用發送與接收功能。

5.Close();關閉釋放資源

 

 

 

HttpHandler(一般處理程序)

HttpHandler是一個實現了IHttpHandler接口的特殊類。任何一個實現了IHttpHandler接口的類,是作為一個外部請求的目標程序的前提。如果是沒有實現這個接口的類,就不能被瀏覽器請求。我們可以通過創建一個我們自己的HttpHandler程序來生成瀏覽器代碼,發送回客戶端瀏覽器!當我們不需要返回過多的Html代碼的時候可以使用它哦 (.ashx)

 IHttpHandler的定義是這樣的:

  ...public interface IHttpHandler

{

       ...bool IsReusable{get;}

        ...void ProcessRequest(HttpContext context);

}

其中ProcessRequest就是我們處理請求的主要代碼;

IsReusable屬性用來表示在IHttpHandlerFactory對象創建IHttpHandler的時候是否能夠將這個Handler存入池中以便重用。

IHttpHandlerFactory的定義是這樣的:

   ...public interface IHttpHandlerFactory

{

     ...IHttpHandler  GetHandler(HttpContext context,string requestType,string url,string pathYranslated);

     ...void ResaseHandler(IHttpHandler handler);

}

GetHandler(),返回實現了IHttpHandler接口的類的實例。

ReleaseHandler(),使得Factory可以重復使用一個已經存在的Handler實例

案例:使用HttpHandler實現圖片防盜鏈

    public void ProcessRequest(HttpContext context){

           context.Response.ContentType="text/plain";

     //獲取文件服務器端物理路徑

           string FileName=context.Server.MapPath(context.Request.FliePath);

    //如果UrlReferrer為空,則顯示一張默認的禁止盜鏈的圖片

           if(context.Request.UrlReferrer.Host==null)

             {

       context.Response.ContentType="image/JPEG";

       context.Response.WriteFile("/error.jpg");

            }

    //如果urlRefferrer中不包含自己站點的主機域名,則顯示一張默認的禁止盜鏈的圖片

      else

    {

           if(coontext.Request.UrlReferrer.Host.IndexOf("hezhiqiang.com")>0)

      {

                 context.Respones.ContentType="image/JPEG";

         context.Response.WriteFile(FileName);   

      }  

        else

        {

            context.Respones.ContentType="image/JPEG";

         context.Response.WriteFile("/error.jpg");

        }        

           }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM