進程和線程:
一個進程至少有一個線程,同一個進程中的多個線程可以並發執行。所謂的並發只是不停的切換,只是電腦切換的太快了,人我們的大腦感覺到是在並發執行。
線程是程序中的一個執行流,每個線程都有自己的專有寄存器(棧指針,程序計數器等),但代碼區是共享的,即不同的線程可以執行同樣的函數。
多線程是指程序中包含多個執行流,即在一個程序中同時運行多個不同的線程來執行不同的任務(代碼),也就是說單個程序創建多個並行執行的線程來完成各自的任務。
線程肯定也要執行一段代碼的。所以要產生一個線程,必須先為該線程寫一個方法,這個方法中的代碼就是該線程運行所要執行的代碼。
線程啟動時,通過委托調用該方法。
為什么要用多線程?
1.讓計算機“同時”做多件事情,節約時間。
2.后台運行程序,提高程序的運行效率,也不會是主界面出現無響應的情況。
3.多線程可以讓一個程序“同時”處理多件事情。
4.計算機CPU大部分時間處於空閑狀態,浪費了CPU資源。
產生一個線程的4步驟:
1.編寫產生線程所要執行的方法。
2.引用Syetem.Threading命名空間
3.實例化Thread類,並傳入一個指向線程所要運行方法的委托。如:Thread thread=new Thread(一個委托:無參數無返回值的方法);
4.調用Thread實例的Start方法,標記該線程可以被CPU執行,但具體執行時間由CPU決定。如:Thread.Star();
前台線程:只有所有的前台線程都關閉才能完程序關閉時。默認為前台線程。
后台線程:只要所有的前台線程結束,后台線程自動結束。將一個線程設置為后台線程thread.IsBackground=true;
每個線程單獨執行方法。
線程執行帶參數的方法:
方法:void ShowTxtName(object name);
ParameterizedStart pts=new Parameterized(ShowTxtName);
Thread thread new Thread(pts);
thread.IsBackground=true;
thread.Start(txtName.Text);
也可以不創建Parameterized對象,直接:Thread thread=new Thread(ShowTxtName);
多線程執行帶多個參數的方法時:由於線程接受的參數是object類型的,所以我們可以傳數組,結構,或泛型,還有ArrayList等。
Socket相關概念:
(1)socket英文原意是“孔”或插座,作為進程通信機制,去后一種意思。通常也稱作套接字,用於描述IP地址和端口,是一個通信鏈的句柄。(其實就是兩個程序通信用的)。
(2)socket非常類似於電話插座,以一個電話網為例,電話的通話雙方相當於相互通信的兩個程序,電話號碼就是IP地址,任何用戶在通話之前,首先要占用一部電話機,相當於申請一個socket,同時要知道對方的號碼,相當於對方有一個固定的socket,然后向對方撥號呼叫,相當於發出連接請求,對方假如在場並空閑,拿起電話話筒,雙方就可以正式通話,相當於連接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當於向socket發送數據和從socket接收數據。通話結束后,一方掛起電話機相當於關閉socket,撤銷鏈接。
(3)在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟件,同時提供幾種服務,每個服務打開一個socket,並綁定到一個端口上,不同的端口對應不同的服務(應用程序)。
(4)例如:http使用80端口,ftp使用21端口,smpt使用23端口
(5)有兩種類型:
a.流式socket(STREAM):是一種面向連接的socket,針對於面向連接的tcp服務應用,安全,但是效率低。
b.數據報式socket(DATAGRAM):是一種無連接的socket,對於無連接的UDP服務應用,不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高。
Socket一般應用模式:(服務器端和客戶端)
1.服務器端的Socket(至少需要兩個)
(1)一個負責接收客戶端連接請求,但不負責與客戶端通信
(2)每成功接受一個客戶端的鏈接便在服務端產生一個對應的Socket
a.在接收客戶端連接時創建
b.為每個連接成功的客戶端創建一個對應的socket(負責和對應的客戶端通信)
2.客戶端Socket
(1)必須指定要連接的服務端地址和端口
(2)通過創建一個Socket對象來初始化一個服務器端的TCP鏈接
Socket的通訊過程:
1.服務器端:
(1)申請一個Socket
(2)綁定到一個IP地址和一個端口上
(3)開啟偵聽
2.客戶端:
(1)申請一個Socket
(2)連接服務器(指明IP地址和端口號)
3.服務器接到連接請求后,產生一個新的Socket(端口大於1024)與客戶端建立連接並進行通訊,原偵聽Socket繼續偵聽。