開源項目:用環信MQTT實現"世界頻道"只需5分鐘【附源碼】
- 來源: 壹點網 2022-04-26 17:08:22
說到“世界頻道”想必大家都不陌生,常見的如王者榮耀的世界廣播搖人組隊以及最近興起的Discord社區交友等等。究其目的就是在應用內讓海量用戶可以實時互動。有些開發者為了實現這種場景會選擇聊天室方案來實現,但是這種方式存在一定的局限性,比如聊天室人數上限、海量消息處理等各種情況。
當然如果有錢有顏,可以直接選擇云廠商產品(比如環信的聊天室方案和超級社區),如果有才有time,也可以選擇平替版MQTT實現方案。今天小猿將介紹用環信MQTT消息云實現應用內的世界頻道,滿滿干貨,不要錯過~~
使用MQTT實現世界頻道-Demo效果演示
協議優勢:
在介紹具體方案之前,我們先嘮一嘮為啥選擇MQTT協議。
輕量級:MQTT本身是物聯網的連接協議,專為受限設備和低帶寬場景使用。所以其代碼占用空間較小,同樣適用于注重SDK大小的移動應用領域(比如:游戲領域)。
易集成:MQTT作為標準開放的消息協議,經過多年演進,已支持30多種開發語言,10余種SDK,無論何種開發環境,都可以快速找到開源SDK。
高并發:MQTT是輕量級的消息傳輸協議,2字節心跳報文,最小化傳輸和連接成本,云廠商broker產品都可支持千萬級并發接入,適用于高并發連接場景。
低成本:MQTT是基于客戶端-服務器的訂閱/發布模型,通過服務器中間件實現消息分發,減少消息復制成本,快速實現一對多在線推送。
靈活性:MQTT協議支持多種消息特性,包括:topic主題層級、消息分級(QoS0,1,2)、遺囑消息、保留消息等,可以靈活實現多種業務場景。
衍生功能:隨著MQTT云服務的發展,部分服務器廠商已支持消息存儲、獲取在線設備列表、查看歷史消息等衍生功能,降低開發工作量與消息存儲成本。
實現方案:
言歸正傳,上干貨。本次技術實現方案包含:移動客戶端(Android)、后端服務(Java)以及MQTT服務器。這里提一下,MQTT服務器使用環信MQTT消息云,使用三方云服務比較省心,既節省開發時間,產品性能也不需要擔心,現在注冊可以直接使用環信MQTT消息云超高額度的免費版:每月100并發連接、300萬消息,完全滿足功能開發使用。
客戶端實現:
客戶端實現主要包含以下兩部分:
底層MQTT業務集成:包含引入SDK、MQTT方法封裝、業務交互(消息收發)。
APP上層交互:在APP首頁提供世界頻道入口,實現心情彈幕飄窗(接收)和發送。
接下來上底層MQTT業務集成代碼。
引入SDK:
這一步環信官方文檔比較明確,就是根據自己的平臺引入相應的mqtt客戶端sdk,這里簡單貼一下AndroidStudio的引入配置
1// 在根目錄 build.gradle repositories 下加入配置
2maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" }
3...
4// 然后加入 MQTT 依賴
5// MQTT sdk https://docs-im.easemob.com/mqtt/qsandroidsdk
6implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
7implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
方法封裝
這里貼一下對mqtt相關方法的簡單封裝,代碼在vmmqtt模塊兒的MQTTHelper類下:
1 /**
2 * Create by lzan13 on 2022/3/22
3 * 描述:MQTT 幫助類
4 */
5 object MQTTHelper {
6
7 private var mqttClient: MqttAndroidClient? = null
8
9 // 緩存主題集合
10 private val topicList = mutableListOf()
11
12 /**
13 * 鏈接MQTT
14 * @param id 用戶 Id
15 * @param token 用戶鏈接 MQTT 的 Token
16 * @param topic 需要訂閱的主題,不為空就會在連接成功后進行訂閱
17 */
18 fun connect(id: String, token: String, topic: String = "") {
19 // 處理訂閱主題
20 if (topic.isNotEmpty()) topicList.add(topic)
21
22 // 拼接鏈接地址
23 val url = "tcp://${MQTTConstants.mqttHost()}:${MQTTConstants.mqttPort()}"
24 // 拼接 clientId
25 val clientId = "${id}@${MQTTConstants.mqttAppId()}"
26 mqttClient = MqttAndroidClient(VMTools.context, url, clientId)
27
28 //連接參數
29 val options = MqttConnectOptions()
30 options.isAutomaticReconnect = true //設置自動重連
31 options.isCleanSession = true // 緩存
32 options.connectionTimeout = CConstants.timeMinute.toInt() // 設置超時時間,單位:秒
33 options.keepAliveInterval = CConstants.timeMinute.toInt() // 心跳包發送間隔,單位:秒
34 options.userName = id // 用戶名
35 options.password = token.toCharArray() // 密碼
36 options.mqttVersion = MqttConnectOptions.MQTT_VERSION_3_1_1;
37 // 設置MQTT監聽
38 mqttClient?.setCallback(object : MqttCallback {
39 override fun connectionLost(t: Throwable) {
40 // 通知鏈接斷開
41 VMLog.d("MQTT 鏈接斷開 $t")
42 }
43
44 @Throws(Exception::class)
45 override fun messageArrived(topic: String, message: MqttMessage) {
46 // 通知收到消息
47 VMLog.d("MQTT 收到消息:$message")
48 // 如果未訂閱則直接丟棄
49 if (!topicList.contains(topic)) return
50 notifyEvent(topic, String(message.payload))
51 }
52
53 override fun deliveryComplete(token: IMqttDeliveryToken) {}
54 })
55 //進行連接
56 mqttClient?.connect(options, null, object : IMqttActionListener {
57 override fun onSuccess(token: IMqttToken) {
58 VMLog.d("MQTT 鏈接成功")
59 // 鏈接成功,循環訂閱緩存的主題
60 topicList.forEach { subscribe(it) }
61 }
62
63 override fun onFailure(token: IMqttToken, t: Throwable) {
64 VMLog.d("MQTT 鏈接失敗 $t")
65 }
66 })
67 }
68
69 /**
70 * 訂閱主題
71 * @param topic 主題
72 */
73 fun subscribe(topic: String) {
74 if (!topicList.contains(topic)) {
75 topicList.add(topic)
76 }
77 try {
78 //連接成功后訂閱主題
79 mqttClient?.subscribe(topic, 0, null, object : IMqttActionListener {
80 override fun onSuccess(token: IMqttToken) {
81 VMLog.d("MQTT 訂閱成功 $topic")
82 }
83
84 override fun onFailure(token: IMqttToken, t: Throwable) {
85 VMLog.d("MQTT 訂閱失敗 $topic $t")
86 }
87 })
88 } catch (e: MqttException) {
89 e.printStackTrace()
90 }
91 }
92
93 /**
94 * 取消訂閱
95 * @param topic 主題
96 */
97 fun unsubscribe(topic: String) {
98 if (topicList.contains(topic)) {
99 topicList.remove(topic)
100 }
101 try {
102 mqttClient?.unsubscribe(topic)
103 } catch (e: MqttException) {
104 e.printStackTrace()
105 }
106 }
107
108 /**
109 * 發送 MQTT 消息
110 * @param topic 主題
111 * @param content 內容
112 */
113 fun sendMsg(topic: String, content: String) {
114 val msg = MqttMessage()
115 msg.payload = content.encodeToByteArray() // 設置消息內容
116 msg.qos = 0 //設置消息發送質量,可為0,1,2.
117 // 設置消息的topic,并發送。
118 mqttClient?.publish(topic, msg, null, object : IMqttActionListener {
119 override fun onSuccess(asyncActionToken: IMqttToken) {
120 VMLog.d("MQTT 消息發送成功")
121 }
122
123 override fun onFailure(asyncActionToken: IMqttToken, exception: Throwable) {
124 VMLog.d("MQTT 消息發送失敗 ${exception.message}")
125 }
126 })
127 }
128
129 /**
130 * 通知 MQTT 事件
131 */
132 private fun notifyEvent(topic: String, data: String) {
133 LDEventBus.post(topic, data)
134 }
135 }
業務交互
和業務相關的就是在啟動APP后,使用后端服務器返回的鑒權token信息及連接封裝接口登錄環信通MQTT服務器,登錄成功后訂閱主題并監聽消息。
1// 請求 token 成功后,調用MQTTHelper.connect()鏈接 MQTT 服務器,這里會同時傳遞監聽的主題
2MQTTHelper.connect(mUser.id, token, MQTTConstants.Topic.newMatchInfo)
3
4/**
5 * 發送匹配信息
6 */
7private fun sendMatchInfo() {
8 if (selfMatch.user.nickname.isEmpty()) return
9 // 提交自己的匹配信息到服務器
10 mViewModel.submitMatch(selfMatch)
11 val json = JSONObject()
12 json.put("content", selfMatch.content)
13 json.put("emotion", selfMatch.emotion)
14 json.put("gender", selfMatch.gender)
15 json.put("type", selfMatch.type)
16 val jsonUser = JSONObject()
17 jsonUser.put("avatar", mUser.avatar)
18 jsonUser.put("id", mUser.id)
19 jsonUser.put("nickname", mUser.nickname)
20 jsonUser.put("username", mUser.username)
21 json.put("user", jsonUser)
22 MQTTHelper.sendMsg(MQTTConstants.Topic.newMatchInfo, json.toString())
23}
24
25// 監聽消息這里使用了一個事件總線進行通知,在上邊封裝 MQTTHelper 發送消息也使用了這個,
26// 訂閱 MQTT 事件
27LDEventBus.observe(this, MQTTConstants.Topic.newMatchInfo, String::class.java) {
28 val match = JsonUtils.fromJson(it, Match::class.java)
29 // 這里收到匹配信息之后就增加一條彈幕
30 addBarrage(match)
31}
后端服務實現
接下來介紹后端服務實現,主要包含以下兩部分:
配置連接信息:配置環信MQTT消息云連接信息。
獲取鑒權信息:獲取客戶端連接需要的鑒權信息。
配置連接信息
配置部分只需要按照環信后臺配置信息進行替換就好,配置在config目錄下的config.xxx.json文件內
1/**
2 * Easemob MQTT 配置 https://console.easemob.com/app/generalizeMsg/overviewService
3 */
4config.mqtt = {
5 host: 'mqtt host', // MQTT 鏈接地址
6 appId: 'appId', // MQTT AppId
7 port: [ 1883, 1884, 80, 443 ], // MQTT 端口 1883(mqtt),1884(mqtts),80(ws),443(wss)
8 restHost: 'https://api.cn1.mqtt.chat/app/8igtc0', // MQTT 服務 API 地址
9 clientId: 'client id', // 替換環信后臺 clientId
10 clientSecret: 'client secret', // 替換環信后臺 clientSecret
11};
獲取鑒權信息
這里主要是獲取客戶端連接所需要的鑒權信息token,為了安全token肯定是要放在服務器端生成的,廢話不多說,上代碼:
1/**
2 * Create by lzan13 on 2022/3/22
3 * 描述:MQTT 幫助類
4 */
5object MQTTHelper {
6
7 private var mqttClient: MqttAndroidClient? = null
8
9 // 緩存主題集合
10 private val topicList = mutableListOf()
11
12 /**
13 * 鏈接MQTT
14 * @param id 用戶 Id
15 * @param token 用戶鏈接 MQTT 的 Token
16 * @param topic 需要訂閱的主題,不為空就會在連接成功后進行訂閱
17 */
18 fun connect(id: String, token: String, topic: String = "") {
19 // 處理訂閱主題
20 if (topic.isNotEmpty()) topicList.add(topic)
21
22 // 拼接鏈接地址
23 val url = "tcp://${MQTTConstants.mqttHost()}:${MQTTConstants.mqttPort()}"
24 // 拼接 clientId
25 val clientId = "${id}@${MQTTConstants.mqttAppId()}"
26 mqttClient = MqttAndroidClient(VMTools.context, url, clientId)
27
28 //連接參數
29 val options = MqttConnectOptions()
30 options.isAutomaticReconnect = true //設置自動重連
31 options.isCleanSession = true // 緩存
32 options.connectionTimeout = CConstants.timeMinute.toInt() // 設置超時時間,單位:秒
33 options.keepAliveInterval = CConstants.timeMinute.toInt() // 心跳包發送間隔,單位:秒
34 options.userName = id // 用戶名
35 options.password = token.toCharArray() // 密碼
36 options.mqttVersion = MqttConnectOptions.MQTT_VERSION_3_1_1;
37 // 設置MQTT監聽
38 mqttClient?.setCallback(object : MqttCallback {
39 override fun connectionLost(t: Throwable) {
40 // 通知鏈接斷開
41 VMLog.d("MQTT 鏈接斷開 $t")
42 }
43
44 @Throws(Exception::class)
45 override fun messageArrived(topic: String, message: MqttMessage) {
46 // 通知收到消息
47 VMLog.d("MQTT 收到消息:$message")
48 // 如果未訂閱則直接丟棄
49 if (!topicList.contains(topic)) return
50 notifyEvent(topic, String(message.payload))
51 }
52
53 override fun deliveryComplete(token: IMqttDeliveryToken) {}
54 })
55 //進行連接
56 mqttClient?.connect(options, null, object : IMqttActionListener {
57 override fun onSuccess(token: IMqttToken) {
58 VMLog.d("MQTT 鏈接成功")
59 // 鏈接成功,循環訂閱緩存的主題
60 topicList.forEach { subscribe(it) }
61 }
62
63 override fun onFailure(token: IMqttToken, t: Throwable) {
64 VMLog.d("MQTT 鏈接失敗 $t")
65 }
66 })
67 }
68
69 /**
70 * 訂閱主題
71 * @param topic 主題
72 */
73 fun subscribe(topic: String) {
74 if (!topicList.contains(topic)) {
75 topicList.add(topic)
76 }
77 try {
78 //連接成功后訂閱主題
79 mqttClient?.subscribe(topic, 0, null, object : IMqttActionListener {
80 override fun onSuccess(token: IMqttToken) {
81 VMLog.d("MQTT 訂閱成功 $topic")
82 }
83
84 override fun onFailure(token: IMqttToken, t: Throwable) {
85 VMLog.d("MQTT 訂閱失敗 $topic $t")
86 }
87 })
88 } catch (e: MqttException) {
89 e.printStackTrace()
90 }
91 }
92
93 /**
94 * 取消訂閱
95 * @param topic 主題
96 */
97 fun unsubscribe(topic: String) {
98 if (topicList.contains(topic)) {
99 topicList.remove(topic)
100 }
101 try {
102 mqttClient?.unsubscribe(topic)
103 } catch (e: MqttException) {
104 e.printStackTrace()
105 }
106 }
107
108 /**
109 * 發送 MQTT 消息
110 * @param topic 主題
111 * @param content 內容
112 */
113 fun sendMsg(topic: String, content: String) {
114 val msg = MqttMessage()
115 msg.payload = content.encodeToByteArray() // 設置消息內容
116 msg.qos = 0 //設置消息發送質量,可為0,1,2.
117 // 設置消息的topic,并發送。
118 mqttClient?.publish(topic, msg, null, object : IMqttActionListener {
119 override fun onSuccess(asyncActionToken: IMqttToken) {
120 VMLog.d("MQTT 消息發送成功")
121 }
122
123 override fun onFailure(asyncActionToken: IMqttToken, exception: Throwable) {
124 VMLog.d("MQTT 消息發送失敗 ${exception.message}")
125 }
126 })
127 }
128
129 /**
130 * 通知 MQTT 事件
131 */
132 private fun notifyEvent(topic: String, data: String) {
133 LDEventBus.post(topic, data)
134 }
135}
源碼地址
核心代碼就這么多,不超過500行,這里沒有直接調用環信歷史消息接口獲取消息存儲記錄,后續可以在進行改良,簡化實現流程。源碼鏈接附上,配合使用效果更佳。
服務端github源碼:
https://github.com/lzan13/vmtemplateserver
客戶端github源碼:
https://gitee.com/lzan13/VMTemplateAndroid
寫在最后
MQTT協議資源占用小,并發連接高,集成簡單,特別適用于高頻數據交互場景,比如:游戲的世界廣場、視頻平臺彈幕等等等等,歡迎各位小伙伴集思廣益,基于MQTT服務實現更多的業務場景,享受技術帶來的便利與快樂。
標簽:
【免責聲明】
1、凡本網注明出處非(巨潮財經網)的作品,均轉載于自其它媒體,并不代表本網贊同其觀點和對其真實性負責,目的在于信息的傳遞,本網不承擔稿件侵權行為的連帶責任,如對稿件有質疑請與本網客服聯系。
2、刊發此文目的在于傳遞更多信息,文章內容僅供參考,不構成投資建議,投資者據此操作,風險自擔。
3、如涉及作品內容、版權等其它問題,請在15日內聯系本網客服。
-
開源項目:用環信MQTT實現"世界頻道"只需5分鐘【附源碼】
說到世界頻道想必大家都不陌生,常見的如王者榮耀的世界廣播搖人組隊以及最近興起的Discord社區交友等等。究其目的就是在應用...
2022-04-26 17:08:22
-
中國民生銀行正式發布“光伏貸”系列產品
25日,為踐行國家普惠金融戰略,推動金融服務鄉村振興,支持綠色金融業務發展,助力國家共同富裕示范區建設,民生銀行舉行產...
2022-04-26 16:30:11
-
-
十幾元錢的奶茶,冰雪時光是怎么做到好喝又高級的?
隨著消費的不斷升級,近幾年新式茶飲店也如雨后春筍般的崛起,街邊隨處可見各種品牌的茶飲店鋪。消費者也從最開始的單純追求...
2022-04-26 14:01:21
-
-
餐飲寒冬季,冰雪時光為何掀起開店熱潮?
2020年以來,疫情的陰影一直籠罩著全球經濟的各行各業,中小微企業受到了極大的沖擊,餐飲業更是迎來了非常艱難的時刻。以奶...
2022-04-26 13:54:46
-
盈康生命發布業績預告,實控人一致行動人增持彰顯信心
4月25日,盈康生命科技股份有限公司(簡稱:盈康生命,代碼:300143 SZ)發布業績預告,預計2021年營業收入實現100,000萬元~110,000萬元,重
2022-04-26 12:45:35
-
開源項目:用環信MQTT實現"世界頻道"只需5分鐘【附源碼】
說到世界頻道想必大家都不陌生,常見的如王者榮耀的世界廣播搖人組隊以及最近興起的Discord社區交友等等。究其目的就是在應用...
2022-04-26 17:08:22
-
-
叮咚買菜(DDL.US)盤前續漲1.09%報5.58美元 市民備貨需求激增
昨日漲超7%的叮咚買菜(DDL US)盤前續漲1 09%報5 58美元。消息上,近期北京疫情反復,市民備貨需求激增。叮咚買菜宣布,北...
2022-04-26 16:55:51
-
-
鏗騰電子(CDNS.US)盤前漲3.9%報157美元 第一財季調整后每股盈余為1.17美元
鏗騰電子(CDNS US)盤前漲3 9%,報157美元。該公司昨日發布業績,第一財季調整后每股盈余為1 17美元,超市場預期的1 02美元;營收為9 018億美
2022-04-26 16:54:50
-
-
專業疫苗公司Valneva(VALN.US)盤前漲1.44%報28.81美元 總市值15.5億美元
專業疫苗公司Valneva(VALN US)盤前漲1 44%,報28 81美元,總市值15 5億美元。周二,Valneva和輝瑞公布了萊姆病候選疫苗VLA15的2期兒童試驗
2022-04-26 16:51:17
-
中國民生銀行正式發布“光伏貸”系列產品
25日,為踐行國家普惠金融戰略,推動金融服務鄉村振興,支持綠色金融業務發展,助力國家共同富裕示范區建設,民生銀行舉行產...
2022-04-26 16:30:11
-
央行出手!人民幣對美元匯率波動加大,如何應對?
據外匯交易中心公布,4月26日,銀行間外匯市場人民幣對美元匯率中間價報6 5590元,較前值調貶681個基點。25日,人民銀行公告...
2022-04-26 16:13:15
-
杭州銀行領漲銀行板塊:一季度利潤33億,市值超浙商銀行百億
4月25日晚間,浙江的兩家“雙子星”銀行——浙商銀行和杭州銀行發布了2022年一季報。從一季度業績來看,浙商銀行實現營業收入...
2022-04-26 15:51:26
-
4月26日航天電器盤中創60日新低,富國軍工主題混合A基金重倉該股
4月26日航天電器(002025)盤中創60日新低,收盤報52 0元,當日跌5 81%,換手率0 8%,成交量3 64萬手,成交額1 92億元。...
2022-04-26 16:13:10
-
4月26日中國長城盤中創60日新低,富國中證軍工龍頭ETF基金重倉該股
4月26日中國長城(000066)盤中創60日新低,收盤報8 01元,當日跌7 83%,換手率1 98%,成交量58 19萬手,成交額4 8億元...
2022-04-26 16:06:12
-
4月26日航發控制盤中創60日新低,國投瑞銀國家安全混合基金重倉該股
4月26日航發控制(000738)盤中創60日新低,收盤報19 83元,當日跌5 35%,換手率1 08%,成交量13 45萬手,成交額2 73億...
2022-04-26 16:00:43
-
4月26日順鑫農業盤中創60日新低,泰達宏利集利債券A基金重倉該股
4月26日順鑫農業(000860)盤中創60日新低,收盤報19 48元,當日跌2 94%,換手率2 48%,成交量18 36萬手,成交額3 66億...
2022-04-26 16:04:39
-
4月26日航天發展盤中創60日新低,創金合信先進裝備股票A基金重倉該股
4月26日航天發展(000547)盤中創60日新低,收盤報8 3元,當日跌6 74%,換手率3 49%,成交量43 04萬手,成交額3 67億元...
2022-04-26 16:13:00
-
4月26日國軒高科盤中創60日新低,華泰柏瑞遠見智選混合A基金重倉該股
4月26日國軒高科(002074)盤中創60日新低,收盤報22 95元,當日跌3 29%,換手率2 81%,成交量33 08萬手,成交額7 68億...
2022-04-26 15:51:10
-
4月26日紫光股份盤中創60日新低,中信保誠至遠動力混合A基金重倉該股
4月26日紫光股份(000938)盤中創60日新低,收盤報14 5元,當日跌5 41%,換手率1 04%,成交量29 63萬手,成交額4 44億元...
2022-04-26 16:08:26
-
4月26日太鋼不銹盤中創60日新低,國泰中證鋼鐵ETF基金重倉該股
4月26日太鋼不銹(000825)盤中創60日新低,收盤報5 73元,當日跌7 58%,換手率1 35%,成交量76 88萬手,成交額4 55億元...
2022-04-26 15:58:34
-
4月26日攀鋼釩鈦盤中創60日新低,富國成長領航混合基金重倉該股
4月26日攀鋼釩鈦(000629)盤中創60日新低,收盤報2 84元,當日跌5 65%,換手率1 03%,成交量88 45萬手,成交額2 59億元...
2022-04-26 15:53:12
-
4月26日美年健康盤中創60日新低,諾安雙利債券發起基金重倉該股
4月26日美年健康(002044)盤中創60日新低,收盤報4 69元,當日跌5 82%,換手率1 41%,成交量54 0萬手,成交額2 6億元。...
2022-04-26 15:58:12
-
4月26日云鋁股份盤中創60日新低,前海開源新經濟混合A基金重倉該股
4月26日云鋁股份(000807)盤中創60日新低,收盤報9 31元,當日跌9 35%,換手率4 01%,成交量112 81萬手,成交額10 82億元。資金流向數據方面
2022-04-26 16:10:00
-
4月26日濰柴動力盤中創60日新低,國富中小盤股票基金重倉該股
4月26日濰柴動力(000338)盤中創60日新低,收盤報10 61元,當日跌1 21%,換手率1 45%,成交量73 45萬手,成交額7 95億...
2022-04-26 15:59:18
-
鐵礦石暴跌10%、螺紋鋼跌破4800元,剖析鋼材價格大跌之謎
少有的慘跌!周一鐵礦石期貨價格大跌10 73%,報收794 5元;螺紋鋼和熱卷期貨價格跌幅均超過4%,分別跌破4800元和4900元大關...
2022-04-26 15:59:23
-
李嘉誠看好越南,GDP增速快
作為香港首富,李嘉誠不僅有300億美元的資產,更有十分敏銳的洞察力,用前瞻性的眼光發掘市場價值。目前,李嘉誠拋售了不少在...
2022-04-26 15:53:29
-
天價考研保過班公司成老賴!14家分公司注銷8家,曾獲騰訊千萬投資
4月26日消息,近日,央視財經起底天價考研保過班退費難問題,在黑貓投訴平臺上,有關考研保過班無法退費的投訴有幾百條,最多...
2022-04-26 16:13:37
-
山東輪胎新貴,一年賣了30億
物產中大4月26日發布年度業績報告稱,2021年營業收入約5619 92億元,同比增加39 26%;歸屬于上市公司股東的凈利潤約39 85...
2022-04-26 15:51:17
-
渝農商行:董事長劉建忠辭任 行長謝文輝獲選為新任董事長
中國網財經4月26日訊昨日,重慶農商銀行發布公告稱,近日收到董事長劉建忠提交的辭職報告,劉建忠因年齡原因,辭去該行董事長...
2022-04-26 16:14:02
-
油價又漲回去了 后天趕緊加滿
按照國內成品油調價的規則,新一輪成品油零售價調整窗口將于4月28日24時再度開啟。目前綜合原油品種變化率為3 41%,預計上調...
2022-04-26 16:03:42
-
新政丨天津:首套住房公積金貸款最高限額將提至80萬元
財經網訊4月26日,財經網從天津市住房公積金管理中心獲悉,近日,天津發布《關于調整住房公積金有關政策的通知(征求意見稿)...
2022-04-26 15:48:07
-
中航安盟保險2021年扭虧為盈 保險業務收入同比增長6.92%
中國網財經4月26日訊(記者郭偉瑩實習生王國燚)近日,中航安盟財產保險有限公司(以下簡稱 "中航安盟 ")發布2021年度報告。報...
2022-04-26 15:52:55
-
銀保監會通報來了!部分銀行保險機構存在數據錯報、漏報、瞞報等突出問題
上證報中國證券網訊(記者韓宋輝)上海證券報記者獨家獲悉,銀保監會近日下發關于銀行保險機構股權和關聯交易監管信息系統數...
2022-04-26 15:30:09
-
杭州首輪集中供地攬金超800億 60幅地塊僅一幅流拍
原標題:杭州首輪集中供地攬金超800億:60幅地塊僅一幅流拍21世紀經濟報道記者唐韶葵實習生王佳琦上海報道4月25日,杭州2022...
2022-04-26 15:29:55
-
OPPO新專利可用耳機控制攝像頭旋轉
財經網科技4月26日訊,據IT之家消息,OPPO廣東移動通信有限公司 "攝像頭的控制方法、裝置、電子設備及存儲介質 "專利公布。...
2022-04-26 15:52:43
- 1鋼鐵股震蕩走低 中國黃金國際跌4%
- 2華潤雙鶴(600062.SH)盤初一度沖高至25.99元 快速回落一度跌超5%
- 3波司登(3998.HHK)漲4.19%報3.73港元 總市值406億港元
- 4冀東水泥(000401.SZ)現跌5.64%報11.54元 招金礦業、山東黃金跌超5%
- 5新華制藥(0719.HK)漲4.19%報4.48港元 總市值30億港元
- 6石四藥集團(2005.HK)股價繼續走強 現報3.9港元漲幅4%
- 7中國船舶租賃(3877.HK)再度拉升漲超5% 總市值超80億港元
- 8威勝信息(688100.SH)漲8.05%報18.92元 總市值95億元
- 9新零售板塊繼續走強 茂業商業、新世界漲停