由于我對TCP稍微熟悉,所以本系列文章只描述socket(套接字)接口的TCP編程
在IT領(lǐng)域中,大家經(jīng)常聽說Client/Server的概念,這個概念是描述了提供服務(wù)的一方(服務(wù)器)和接受服務(wù)的一方(客戶端)之間的拓撲結(jié)構(gòu)。舉例來說,http://www.vckbase.com這個網(wǎng)站提供大家交流和娛樂的服務(wù),他們的計算機對于我們而言就是服務(wù)器,而我們的計算機則是客戶端。一般而言,服務(wù)器功能比較強大,一個服務(wù)器能提供服務(wù)給多個客戶端。
對于socket設(shè)計而言,我們往往也提到一個服務(wù)器端和客戶端的概念,但是它的概念和前面而言基本是不一樣的。這里的概念其實是指在開始通訊時誰先發(fā)起連接的過程。
對于通訊的雙方而言,存在一個建立對話通道的過程,該過程的建立必然是一方主動發(fā)起的。我們稱呼主動建立鏈路的一方為客戶端,而另外一方為服務(wù)器端。(至少我個人這么稱呼,不知道業(yè)界是不是都這么說)
在通訊過程中,服務(wù)器端必須在某個預(yù)先約定的端口等待其他主機建立鏈路,這個過程稱為偵聽(Listen)。客戶端主動建立鏈路的過程成為連接 (Connect)。當(dāng)服務(wù)器端套接字接到一個連接請求后,會生成一個新的套接字。服務(wù)器端主機就通過這個套接字和客戶端主機通訊。
在整個過程中,涉及到三個套接字,他們分別是服務(wù)器端套接字(我一般稱呼它為server socket)、客戶端套接字(一般我稱呼它為client socket)和服務(wù)器端套接字創(chuàng)建出來的套接字。在編程過程中,第三種套接字除了不會主動建立鏈路外,功能和client socket完全一致,因此我也把它稱為client socket。為了區(qū)別,對于客戶端的client socket,大家可以稱呼它為主動client socket(Active Client Socket, ACS),而對服務(wù)器端的那個客戶端套接字,則稱為被動client socket(Passive Client Socket, PCS)。一般情況下,我們沒有必要區(qū)分ACS和PCS,因為PCS的功能是ACS的一個部分,ACS只多一項功能而已。在后文中,我將不區(qū)分這兩種 client socket
對于server socket, 它有如下功能:
- 等待客戶端建立連接(listen)
- 當(dāng)客戶端建立發(fā)送連接請求時,能接受請求,完成鏈路建立(accept)
- 關(guān)閉(close)
對于client socket,它有如下功能:
- 建立鏈路(connect)
- 發(fā)送數(shù)據(jù)(send)
- 接收數(shù)據(jù)(recv)
- 關(guān)閉(close)
一個簡單的通訊過程應(yīng)該這樣:
- server socket開始偵聽(listen)
- client socket開始連接(connect)
- server socket接受連接(accept)
- ACS和PCS開始互相發(fā)送數(shù)據(jù)(send/recv)
- ACS或PCS關(guān)閉鏈路(close)
- server socket關(guān)閉(close)
本系列將根據(jù)以上過程介紹socket編程的方方面面。由于阻塞套接字相對簡單,我會先從阻塞套接字(也就是伯可力套接字)編程開始,之間會穿插一些多線程的知識。很多方面我也沒用過,所以有些東西只能邊試邊寫,和大家探討。