android + springboot實現點對點實時聊天

前言

這週一就須要交android大實驗做業,android大實驗作了一個二手商城,可是功能太少了,android老師要求大實驗要有一些特點。就想着實現一下實時聊天。而後就利用週日時間試了一下。android

socket

實時聊天須要socket鏈接。普通的後臺請求是http或者https請求,這表明着前臺發出請求,後臺響應請求,就結束了。而socket協議是一種長鏈接,一旦前臺或者後臺創建鏈接後,須要一方發出關閉鏈接纔會斷開。在鏈接中客戶端和服務端能夠隨意的互相發送信息。這很是適用於實時聊天情景。若是實時聊天使用經常使用的http協議,不但會每發出一條消息就發出一個請求,這會佔用大量服務器資源,而且服務端沒法主動向接收客戶端發送消息。git

界面實現

聊天界面實質上也是一種列表,只要使用android經常使用的列表佈局就能夠,只須要判斷一下一條消息是不是本人發出,若是是本人發出,須要在右邊顯示信息image.png
具體實現能夠從網上找一篇博客來實現。值得注意的是,每一個聊天氣泡仍是頗有意思的,咱們看到的聊天氣泡也是背景圖片,可是是一種特殊格式的背景圖片,他會隨着內容的變化而拉伸,這一切都是android本身變化的,官方叫這種圖片爲點九圖。咱們先看一下使用點九圖與不使用點九圖的差異github

image.png
image.png
點九圖也是能夠本身製做的,這裏咱們理解一下他的大體原理
image.png
上邊黑線表明水平拉伸時拉伸的區域,
左邊黑線表明豎直拉伸的區域,
底部黑線和右邊黑線表明內容的顯示區域,
顯示效果如圖。image.png
點九圖須要被設置爲背景圖片而且已.9名字結尾。如background.9.png。
可能因爲使用的場景很少,網上找不到現成的資源,我去github一個成品項目裏找到了一個拿來直接使用。
給你們個本項目鏈接,不用再去找了https://github.com/zhaokaiqia...web

實現

實現交互通訊參考了另外一篇博客。https://xlui.me/t/spring-boot...
大概原理就是兩個客戶端分別與服務端創建socket通訊,同時訂閱一個地址的消息。固然這個地址帶有本用戶id。發送消息的時候,須要發送給另外一個地址,而且帶有接收方的id,服務器負責接收發送數據而且經過接收方id發送給接收方所接收的數據。spring

image.png
具體實現方式能夠參考上面的博客,博客裏實現了廣播,動態羣組,點對點消息。也能夠看本項目
https://github.com/zhaokaiqia... 只用到了點對點消息。
image.png數據庫

麻煩的地方

有一個問題,在設計數據庫的時候chat與user爲多對多關係,可是chat裏其實只有兩個user,分別對應聊天的兩我的A與B。對於A來講,B是他的聊天對象,對於B來講,A是他的聊天對象。這就須要對chat.users.get(0)與當前登陸用戶id判斷是否相等,來顯示對方與本身的用戶名和頭像。
暫時沒有想到好的解決辦法。服務器

image.png

總結

在實現的過程當中因爲時間緊迫也作了不少妥協。可是寫大實驗,只要實現就行,老師根本不關心會不會有bug,你用了什麼實現。感謝黃庭祥學長在我實現的時候給予的幫助websocket

相關文章
相關標籤/搜索