c語言編寫一個linux下的類似於qq聊天軟體的伺服器 ?

c語言編寫一個linux(Ubuntu)下的類似於qq的伺服器 請問應該從哪裡入手?應該分為哪些模塊?有沒有什麼框架,或者大致的方法?github上有沒有好的項目值得學習?虛心求教。


蘑菇街TeamTalk。你要做的它都做了,可以好好研究下。

github: https://github.com/mogujie/TeamTalk

之前被網易告了一次,說是抄襲網易泡泡通訊協議之類的,被github下架了。後來代碼大改了,純c++伺服器源碼(之前是java+c++)。

有windows,mac,ios,ad的客戶端。


就不要去裸socket了,直接上zmq,分分鐘寫一個出來。


過兩天寫寫


看你要支持都是規模,如果規模不大,就c/s即可,所有消息通過伺服器轉發。如果要達到qq規模,伺服器進行所有消息轉發,這個伺服器就得超級無敵了,寬頻也會成為瓶頸。我沒研究qq是如何實現的,但是我猜是用p2p的,否則伺服器投入是天文數字。

用udp 穿透nat,客戶端跟客戶端直接建立通信,無法穿透的從才通過伺服器轉發(極少)。我qq好友上千,打開qq就好卡,這也是我不用qq的原因之一。


ukari/DP2PCSC · GitHub

分散式端到端,沒有中間伺服器。

沒寫readme,有pdf說明,鏈接: 百度雲 密碼: rz5a

-----------

已補充readme


更新:推薦用Erlang干這事兒,我的寫的太懶,且是Erlang的,就不放上來了。

socket加自定義協議(或者直接用其他im協議 ,比如XMPP, mqtt,redis等等 )就可以。

難點目前遇到的就是單機最大連接數和集群

做簡單,做好難。


其實如果只是想簡單實現的話,只要你會用Socket這個project幾乎沒有難點啊。

監聽一個埠,每個新的Client接入的時候就往這個埠發request,然後給它分配一個獨立的埠用於之後的通信。

寫一個小型的資料庫,也就是存點用戶信息和聊天記錄啥的。

再寫一個組件用來和Client互動,也就是檢測用戶名密碼,創建用戶,轉發或者保存信息啥的。

然後...好像也沒什麼然後了。一個簡單的IM server就搞定了。以前用Java寫過,沒多少行。C比Java稍微複雜點,但也就是在通信的時候複雜點而已(Java通信的時候可以傳Object,C好像只能傳字元的樣子)。


openfire,很好的生態鏈條了,包括可以互通互聯的協議


這是學習網路編程的demo。。。 只要socket就可以了,qq群功能會廣播就行。。


沒有搞過,隨便吹幾句

具體取決於你如何定義「類似」

1 如果只是支持上千人同時在線。單電腦單個進程就可以支持,可以使用libev之類的庫進行網路處理

業務按照功能挨個實現

a 用戶註冊,登錄(頂掉已登錄的)
b 好友添加,刪除
c 好友狀態同步(上線下線即時通知)
d 消息發送,接收(向離線用戶發送消息,下次上線後可以收到)
e 消息表情功能,消息文本樣式(可選)
f 其他功能忽略

這個是伺服器端,另需要單獨寫客戶端

這裡面唯一的難點可能就是學習libev的使用,看demo,看文檔即可。

2 如果要支持更多人在線。單個電腦是處理不了,需要多台電腦一起處理

如果把沒有用戶看成點,用戶好友關係看成邊,就形成了一張巨大的圖,用戶之間的消息就沿著邊流動。核心問題就是圖的組織,以及消息的快速路由。

以下是個人的一些猜想。

按地域劃分成多個分區(比如中國如果按省劃分,不到40個分區),用戶登錄時連接到某個分區上,通過類似域名查詢的功能可以查詢用戶所在的分區(可以參考類似DNS之類的東西,畢竟跨區域流動的人口佔總人數比例不大)

每個分區裡面可以根據用戶號碼把業務處理分發到多台伺服器來處理(如果數據量實在太大,可以增加網關層次)。 簡單來說,有點類似

http://f.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=af687200e9c4b7452099bf44ae957572/9213b07eca806538a9ea503a95dda144ad348293.jpg

隨便找了個圖片,環上的相當於區域的根部網關,子網關以及伺服器掛在下面。

上面提到的問題是這樣來解決。

a 圖的組織,變成樹形結構。

b 消息路由,通過節點的域名通過樹邊流動


先把unix網路編程一書看了,socket的讀寫、網路事件監聽機制(select,epoll)、異常情況(對端機器崩潰等)、伺服器常用模型(單線程迭代,多線程並發),先把這些都搞熟練。多琢磨一下tcp協議的實際運作。

有了這些必要的基礎再去寫實際的程序才能學到東西。不學這些也可以把功能寫出來,但是異常情況怎麼處理?同時要轉發多個大文件怎麼處理?同時有大量用戶發送數據怎麼處理?

我是初學者,以上是我認為比較重要的東西。希望對你有幫助


推薦閱讀:

有哪些輕量級web伺服器?
長期開機的機器是怎麼會那麼耐用的?
浪潮公司為什麼是從濟南發展起來的?
使用Erlang實現http server是否更有優勢?
為何 Boost 的 Asio 要使用 Proactor 模式實現?

TAG:Linux | 伺服器 | Ubuntu | 聊天 | C編程語言 |