官术网_书友最值得收藏!

2.5 TCP服務(wù)

如果開(kāi)發(fā)者大多數(shù)時(shí)間都在進(jìn)行Web站點(diǎn)的開(kāi)發(fā),那么TCP服務(wù)和HTTP服務(wù)相比出場(chǎng)率并不高,但HTTP僅僅是應(yīng)用層協(xié)議的一種,除了HTTP之外,應(yīng)用層還有一些比較常用的協(xié)議,例如FTP、SMTCP、Telnet等。

TCP服務(wù)不是我們介紹的重點(diǎn),這一節(jié)會(huì)簡(jiǎn)單介紹使用Node創(chuàng)建TCP服務(wù)的方法,以及一個(gè)應(yīng)用的例子。

2.5.1 TCP和Socket

大多數(shù)開(kāi)發(fā)者都知道網(wǎng)絡(luò)服務(wù)需要Socket編程,也都清楚TCP協(xié)議是用來(lái)傳輸數(shù)據(jù)的,TCP協(xié)議和Socket又有哪些區(qū)別呢?

Socket是對(duì)TCP協(xié)議的一種封裝方式,Socket本身并不是協(xié)議,而是一個(gè)編程接口,在這個(gè)接口上定義了一些基礎(chǔ)的方法,例如accept、listen、write等,如果一種編程語(yǔ)言實(shí)現(xiàn)了socket接口,那么它就可以通過(guò)socket接口預(yù)定義的方法來(lái)解析使用TCP協(xié)議傳輸?shù)臄?shù)據(jù)流。(socket并不是專門為TCP協(xié)議設(shè)計(jì)的,在設(shè)計(jì)之初就期望能兼容多種傳輸層協(xié)議。)

2.5.2 創(chuàng)建TCP服務(wù)器

在Node中有三種Socket,分別對(duì)應(yīng)實(shí)現(xiàn)TCP、UDP以及UNIX Socket,與這些相關(guān)的代碼都位于Net模塊中(UNIX Socket即UNIX Domain Socket,和面向網(wǎng)絡(luò)的TCP、UDP不同,主要用于本地系統(tǒng)的進(jìn)程間通信)。

Net模塊和HTTP模塊的結(jié)構(gòu)很相似,包含了Server類、Socket類以及一些預(yù)定義的方法,下面的代碼會(huì)創(chuàng)建一個(gè)TCP Server。

代碼2.16 創(chuàng)建一個(gè)TCP服務(wù)器

上面的代碼中,如果服務(wù)器收到了一個(gè)連接請(qǐng)求,就會(huì)返回一個(gè)Hello字符串,雖然該server監(jiān)聽(tīng)了8124端口,但如果在瀏覽器里打開(kāi)localhost:8124的方式來(lái)訪問(wèn),就會(huì)出現(xiàn)GET http://localhost:8124/ net::ERR_INVALID_HTTP_RESPONSE的錯(cuò)誤。原因也很簡(jiǎn)單,一個(gè)TCP服務(wù)器不會(huì)返回符合HTTP協(xié)議標(biāo)準(zhǔn)的響應(yīng),為了驗(yàn)證這個(gè)服務(wù)器,可以使用telnet命令,打開(kāi)控制臺(tái)輸入:

控制臺(tái)隨之輸出:

這表明TCP服務(wù)正常啟動(dòng)了。

如果不想使用命令行,也可以在代碼中使用connect或者createConnection方法來(lái)連接到一個(gè)TCP服務(wù)器,二者沒(méi)有任何區(qū)別。

代碼2.17 TCP客戶端

主站蜘蛛池模板: 平阳县| 兴和县| 萍乡市| 武强县| 鄂伦春自治旗| 闽侯县| 南投县| 襄城县| 扶沟县| 云南省| 达尔| 贵港市| 乐安县| 钟祥市| 泾川县| 苍梧县| 青阳县| 河源市| 电白县| 宁化县| 夏河县| 三江| 聂荣县| 赣榆县| 鸡泽县| 昭通市| 潼南县| 钟祥市| 永康市| 光泽县| 青海省| 连云港市| 澄城县| 克拉玛依市| 林周县| 中江县| 珠海市| 仁怀市| 疏勒县| 海丰县| 崇信县|