標籤:

該如何設計實現一個telnet bbs?

世面上很難找到開發telnet bbs的書籍。但我覺得這是個有意思的嘗試。

telnet客戶端功能有限,只能接收發送文本信息,應該是沒有cookies功能。用戶的各種狀態應該是要存在伺服器上面的。

題主並沒有打算做很複雜的界面,就是單純的文字的交互,輸入A獲取所有文章列表,輸入文章id進入文章詳情這樣。主要是初學c++ primer 和muduo想鍛煉一下。

真心感謝答題的各位前輩,給了我很大的幫助。


這個直接走tcp協議,是長連接的。與你說的cookie沒有關係。

隨便找套源代碼參考參考就行了。現成的開源的很多,當年(2000年前)各大高校bbs都是這個。

實際上與當年的文字mud在原理上也是類似的。

或者你也可以將其當成一個遠程連接的文本終端。


伺服器的源碼應該是有人早就開發好的吧。

你說的好像是客戶端的開發(例如 cterm,fterm)。客戶端和伺服器通過 socket 連接,

伺服器會向客戶端發送一些位元組流,這些位元組流都是用於控制終端屏幕顯示用的。

比如說:清屏,把游標移動到某一行某一列。然後是一些顯示內容。

其中會夾雜顯示控制碼,這些控制碼就是例如前景閃爍,前景顏色代碼,背景顏色代碼。

本質上,你的客戶端負責接收這些位元組流,並把它們翻譯處理,顯示在你的屏幕上即可。你不需要做任何其他事情,(這個用戶的所有狀態數據,幾乎都由伺服器端進行處理和維護)。本質上,就是伺服器告訴你,你的屏幕應該顯示什麼,你照做。

你的屏幕是 M * N 字元尺寸組成的,任何客戶端都應該使用等寬字體。(就像老式印表機那樣的)。大多數字體為了美觀緊湊,實際上不是等寬的。

同時,你也負責把用戶發出的按鍵指令,發送給伺服器。

注意,伺服器和客戶端的通訊是持續的,而且是流式的,你可能接收到一些位元組,然後再接收到一些位元組,然後一個完整的指令,可能是被上面發送給「切」成多個零碎的部分。客戶端需要一個位元組流隊列緩存來接收他們,把伺服器發送的位元組拼湊在一起,把所有已經發送完整的指令,出列,並立即刷新到終端屏幕上。

上面的通訊是客戶端和伺服器長連接,而且每次發送的數據量很小,但非常頻繁,這就是為什麼用這種 terminal 方式的 bbs 灌水,你和其他人交流速度奇快,效率非常高的原因(bbs 通常在校園區域網絡,所以網速不成問題)。

客戶端的麻煩和工作,主要就是在界面方面。

成熟的客戶端已經出現很久,但是悲劇的是,像 fterm 這樣的客戶端,並沒有達到完美的程度,而已經無人維護,源碼也無法公開(主要作者失聯)。遺憾了。


推薦firebird bbs,開站難度並不高,只要知道基本的*nux系統管理以及軟體開發知識就可以了。不過,具體的細節問題估計很難找到人請教,都是失傳的絕學。當時各大bbs站都有不少功能修改,現在估計也失傳了。整套技術現在過時到什麼程度呢?現在連windows中telnet客戶端默認都是沒有開啟的,需要手動打開才有這個功能。

用戶端當然沒有cookie,實際上,如同 @hoodlum1980所說,就是一個M×N的字元陣列,伺服器端通過telnet控制符控制每一個字元。這是完全成熟,完全過時的技術,相比現在的技術,抽象程度很低,也不複雜,掌握起來並不難,關鍵是,掌握了此等屠龍之技什麼用都沒有。


你學的那堆東西,在 Telnet BBS 上根本用不上,樓上說的對,閱讀 FireBird BBS

沒書可看,不過可以給你介紹下 FireBird BBS 的基本流程,這是傳統伺服器的標準做法:

1. 使用阻塞同步 socket + 多進程(每個鏈接一個進程)。

2. 接收鏈接的進程 accept 出一個新的fd來的時候,就 fork出新進程

3. fork出的新進程把文件句柄 0, 1, 2 都 dup2到剛才accept下來的fd上,然後跳轉到 BBS主函數

4. 新進程可以通過 read/write 標準輸入標準輸入和客戶端進行網路通信,可以向客戶端 printf

5. 同步阻塞模式,每個子功能模塊(登錄,看文章,聊天)都由獨立的 read/write循環

6. 如果長期沒 read到用戶數據,用超時信號結束進程

7. 沒有資料庫,所有文章,帖子都是文件,一個帖子一個文件。

8. 用戶之間簡訊也是寫文件,寫完文件給另外一個用戶的進程發送一個信號。

9. 使用 ASCII 的終端控制符控制顯示效果:設置顏色,跳轉游標,回顯,清屏,卷屏。

PS:現在學計算機怎麼沒書就感覺完全學不了的樣子,放以前咋辦呢?切換個新領域咋辦呢?


仍有兩種Telnet BBS服務軟體處於活躍開發狀態,你可以作為參考。

Mystic BBS

Synchronet BBS

大陸、台灣留下的歷史遺迹:Maple BBS、Firebird BBS。

另外還可以參考LPMud體系下的MUD服務軟體,至少結構設計更現代一些。


大一的C語言課程設計 + Windows網路編程 可以讓你玩轉這些東西,不難。

如果你用C#或Java就更簡單了。


20年前流行的技術,現在肯定很難找到什麼書籍了。源代碼應該到處都是,即便重新發明輪子應該也不難。反正就是一個多用戶的文本終端,想怎麼揮霍硬體性能都無所謂。現在隨便找個破電腦,都相當於以前的超級計算機。

如果再復古一點,搞成單用戶文本終端也不是不可以啊:)

最早上bbs的時候,就是直接撥號到伺服器(某熱心網友家的moden),拖了文章趕快滾蛋,換別人再打電話。


cnVintage的Telent版本就是 @張文婷 用Java寫的~用了Lanterna和Flarum,源碼請參見:

cnVintage/cnVintage-Telnet

另外cnvintage的Telent採用白名單制度,需要先去主站登陸並獲得授權。樓主可以玩玩看哈


你下載一個mudos來,做bbs和做文字遊戲都可以啦。


推薦閱讀:

C++ 中對 main 函數的地址賦值會怎樣?
關於2048局面的價值判斷及ai思路?
為什麼5%的CPU佔用會造成這麼大的性能損失?
為什麼工控還在用c?
C++中左值、右值與寄存器的關係是怎樣的?

TAG:CC | Telnet |