該如何設計實現一個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 標準輸入標準輸入和客戶端進行網路通信,可以向客戶端 printf5. 同步阻塞模式,每個子功能模塊(登錄,看文章,聊天)都由獨立的 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++中左值、右值與寄存器的關係是怎樣的?