


Verwenden Sie nginx uwsgi redis, um die GM-Chat-Funktion des Spiels zu implementieren
Ursprüngliche Anforderungen
Ein Kundendienst-GM kann alle Spieler auf dem Spielserver als Freunde hinzufügen und chatten. Die spezifischen Funktionen sind wie folgt:
* GM online und offline
* Spieler als Freunde hinzufügen
* Spieler als Freunde löschen
*GM sendet Chat-Nachricht
* Spieler pushen Chat-Nachrichten
Zusätzliche Einschränkungen: Ein GM-Konto kann mehrere Spieler als Freunde hinzufügen, während ein Spieler nur von einem GM-Konto hinzugefügt werden kann
Anforderungsanalyse
Da es in unserem keinen serverübergreifenden Chat gibt Die Funktion serverübergreifender Freunde wird in Zukunft nicht mehr unterstützt, daher ist die Lösung, den GM Charaktere im Spiel erstellen zu lassen und dann Spieler von jedem Spielserver zum Chat hinzuzufügen, nicht umsetzbar. Darüber hinaus ist der GM kein eigentlicher Spielcharakter und muss nicht im Spiel erstellt werden.
Die ganze Schwierigkeit besteht darin, jedem Spielserver den Zugriff auf verschiedene vom GM gesendete Daten zu ermöglichen und die Spielerdaten an den GM weiterzuleiten.
Spezifische Implementierung
Um die Übertragung von GM-Daten an verschiedene Server zu realisieren, haben wir eine einfache Lösung gewählt: Legen Sie die GM-Daten auf unserem Webserver ab, und jeder Spielserver wird von dort gesendet Der Webserver ruft die Daten ab.
Diese Lösung ist sehr einfach. Es ist keine lange Verbindung zwischen dem Webserver und dem Spieleserver erforderlich. Sie können die Daten direkt mit den Methoden get und post abrufen. Der gesamte Aufbau ist wie folgt:
<code><span>GM1</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>运维聊天服</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>游戏web服务器</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>游戏服务器1</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>游戏客户端1</span><span>|</span><span>|</span><span>|</span><span>|</span><span>|</span><span>|</span><span>GM2</span><span>游戏服务器2</span><span>游戏客户端2</span></code>
Hier nutzen Kundenservice GM1 und GM2 beide das Webinterface, um mit dem Spielclient zu chatten.
Der Betriebs- und Wartungs-Chatserver existiert, weil:
* Die Gründung von GM erfordert die Genehmigung der Betriebs- und Wartungsseite. .
* Der Webserver des Spiels kann auf die Whitelist gesetzt und überprüft werden. Nur die IP des Betriebs- und Wartungs-Chatservers kann auf den Webserver des Spiels zugreifen
Im Bild oben verwenden nur der Spiele-Client und der Spieleserver lange TCP-Verbindungen, während die anderen über kurze http-Verbindungen implementiert werden.
Der Webserver verwendet Nginx, nicht NodeJS. Die Nginx-Lösung ist recht ausgereift und einfach bereitzustellen.
Da ich mit Python viel besser vertraut bin als mit Lua, habe ich uwsgi als Proxy verwendet, anstatt direkt in Lua zu schreiben.
Die Datenbank verwendet Redis und Redis hat geplante Speicherungen eingerichtet. Informationen zur Datenformateinstellung finden Sie im Artikel, den ich zuvor erwähnt habe. Es hat grundsätzlich das Format gm:%d:name
. Der Schlüssel stellt den Namen von gmx dar und der Wert stellt den Namen dar.
Implementierungscode
Die Konfiguration von Nginx und Uwsgi wurde weggelassen. Aus Datenschutzgründen wurden die relevanten IPs weggelassen und der Code enthält genügend Kommentare, sodass ich nicht auf Details eingehen kann:
<code><span>#encoding: utf-8</span><span>""" 新功能: * GM注册 * GM上线 * GM下线 * 加游戏玩家为好友 * 删除游戏好友 * GM推聊天信息 * 玩家推聊天信息 --- 消息数据格式为utf-8处理后的base64编码:游戏服和GM发过来的都是base64格式,要注意分隔符没做base64处理 GS只能用get方式推送消息,所以参数用类似于urllib quote(urlencode)进行了封装。运维客户端也用get 一个GM账号能添加多个游戏玩家为好友,而一个游戏玩家只能被一个GM账号添加 """</span><span>from</span> config <span>import</span> * <span>from</span> json <span>import</span> dumps, loads <span>import</span> base64 <span>import</span> urllib <span>import</span> urllib2 <span>import</span> copy <span>import</span> redis MSG_SEPARATOR = <span>","</span><span>#分割信息</span> MAX_RECV_AMOUNT = <span>10</span><span>#每次消息10条吧</span> MSG_MAX_LEN = <span>500</span><span>#消息不弄太长了</span>CONTENT_TYPE = [(<span>"Content-Type"</span>,<span>"text/html"</span>)] HTTP_STATUS = { <span>200</span>: <span>"200 OK"</span>, <span>404</span>: <span>"404 Not Found"</span>, } GAME_SERVER_INFO_URL = <span>"http://xxxxxyyyyy"</span>ROLE_INFO_URL = <span>"http://xxyyy?uid=%s&hostnum=%s"</span>red = redis.StrictRedis(host=REDIS.HOST, port=REDIS.PORT, db=REDIS.DB) <span>#游戏服务器IP白名单</span><span>if</span><span>not</span> globals().has_key(<span>"gServerIP"</span>): gServerIP = {} res_data = urllib2.urlopen(GAME_SERVER_INFO_URL) res = res_data.read() res_list = res.split(<span>"\n"</span>) <span>for</span> val <span>in</span> res_list: <span>if</span><span>not</span> val: <span>continue</span> _, port, ip, _ = val.split(<span>" "</span>) gServerIP[ip] = port gGMIP = { <span>"xxxxyyyy"</span> : <span>1</span>, } <span><span>def</span><span>is_gm_account_exist</span><span>(account_id)</span>:</span><span>if</span> red.get(<span>"gm_account:%s:name"</span> % account_id): <span>return</span><span>1</span><span>return</span><span>0</span><span><span>def</span><span>is_inter_server</span><span>(hostnum)</span>:</span><span>if</span> ( int(hostnum) >= <span>1000</span> ): <span>return</span><span>0</span><span>return</span><span>1</span><span><span>def</span><span>check_is_int</span><span>(account_id)</span>:</span><span>try</span>: int(account_id) <span>except</span>: <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: -<span>1</span>}) <span>return</span> () <span>#gm client ensures the id is unique</span><span><span>def</span><span>gm_create_account</span><span>(env, params)</span>:</span> account_id, account_name = params[<span>"gm_account"</span>], urllib.unquote(params[<span>"gm_name"</span>]) check_res = check_is_int(account_id) <span>if</span> check_res: <span>return</span> check_res <span>if</span> is_gm_account_exist(account_id): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>1</span>}) <span>#1 the role exists</span> red.set(<span>"gm_account:%s:name"</span> % account_id, account_name) red.sadd(<span>"gm_online_list"</span>, account_id) <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span>#check param</span><span><span>def</span><span>gm_add_friend</span><span>(env, params)</span>:</span> var = gm_account, hostnum, usernum = params[<span>"gm_account"</span>], params[<span>"host"</span>], params[<span>"uid"</span>] <span>for</span> num <span>in</span> var: check_res = check_is_int(num) <span>if</span> check_res: <span>return</span> check_res <span>if</span><span>not</span> is_gm_account_exist(gm_account): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>2</span>}) <span>#2 the role doesn't exist</span><span>if</span> ( red.get(<span>"gs_usernum:%s:friend"</span> % usernum) ): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>3</span>}) <span>#3 the usernum has gotten a friend</span><span>#内服计费没存数据,就不处理了</span><span>if</span><span>not</span> is_inter_server(hostnum): http_res_data = urllib2.urlopen(ROLE_INFO_URL % (usernum, hostnum)) res = loads(http_res_data.read()) <span>if</span> (type(res) != type({})) <span>or</span> (res.get(<span>"code"</span>, <span>0</span>) != <span>1</span>): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>4</span>}) <span>#4 the uid doesn't exist</span> red.sadd(<span>"gm_account:%s:friend"</span> % gm_account, usernum) <span>#两边都处理下</span> red.sadd(<span>"gs_hostnum:%s"</span> % hostnum, usernum) <span>#记录该服务器的所有玩家</span> red.set(<span>"gs_usernum:%s:hostnum"</span> % usernum, hostnum) <span>#该玩家的信息</span> red.set(<span>"gs_usernum:%s:friend"</span> % usernum, gm_account) <span>#一个玩家只能被一个gm添加为好友</span> red.sadd(<span>"apply_frd_list"</span>, usernum) <span>#usernum will be added </span> red.hdel(<span>"remove_frd_list"</span>, usernum) <span>#信息残留</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span><span>def</span><span>gm_remove_friend</span><span>(env, params)</span>:</span> account_id, uid = params[<span>"gm_account"</span>], params[<span>"uid"</span>] <span>if</span><span>not</span> is_gm_account_exist(account_id): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>2</span>}) <span>#2 the role doesn't exist</span><span>if</span> red.get(<span>"gs_usernum:%s:friend"</span> % uid) != account_id: <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>5</span>}) <span># the usernum has friend but isn't the gm</span><span>if</span><span>not</span> red.srem(<span>"gm_account:%s:friend"</span> % account_id, uid): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>4</span>}) <span># the usernum is not a friend of the gm</span> hostnum = red.get(<span>"gs_usernum:%s:hostnum"</span> % uid) red.delete(<span>"gs_usernum:%s:hostnum"</span> % uid) <span>#合服考虑,如果合服了GM手动删除这个玩家吧</span> red.srem(<span>"gs_hostnum:%s"</span> % hostnum, uid) red.delete(<span>"gs_usernum:%s:friend"</span> % uid) red.hset(<span>"remove_frd_list"</span>, uid, hostnum) <span>#uid的信息已经丢失,先额外保存下hostnum信息</span> red.srem(<span>"apply_frd_list"</span>, uid) <span>#信息残留</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span>#GM账号很少</span><span><span>def</span><span>gm_online</span><span>(env, params)</span>:</span> account_id = params[<span>"gm_account"</span>] <span>#可能客户端bug没发下线,直接sadd吧</span><span>if</span><span>not</span> is_gm_account_exist(account_id): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>2</span>}) <span>#2 the role doesn't exist</span> red.sadd(<span>"gm_online_list"</span>, account_id) <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span><span>def</span><span>gm_offline</span><span>(env, params)</span>:</span> account_id = params[<span>"gm_account"</span>] <span>if</span><span>not</span> red.srem(<span>"gm_online_list"</span>, account_id): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>}) <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span>#存在usernum上,gs_msg和gm_msg</span><span><span>def</span><span>gm_sendmsg</span><span>(env, params)</span>:</span> account_id, uid, msg = params[<span>"gm_account"</span>], params[<span>"uid"</span>], urllib.unquote(params[<span>"msg"</span>]) <span>#只能向好友发</span><span>if</span><span>not</span> red.sismember(<span>"gm_account:%s:friend"</span> % account_id, uid): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>4</span>}) <span># the usernum is not a friend of the gm</span><span>if</span> red.get(<span>"gs_usernum:%s:friend"</span> % uid) != account_id: <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>5</span>}) <span># the usernum has friend but isn't the gm or doesn't have</span> red.lpush(<span>"gs_usernum:%s:msg_from_gm"</span> % uid, msg) red.sadd(<span>"gm_newmsg_list"</span>, uid) <span>#gs get msg from this set</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span>#gm轮训所有的,他那边还有个服务器...</span><span>#{gm_account:{"uid": msg, "uid2": msg2}}</span><span><span>def</span><span>gm_receivemsg</span><span>(env, params)</span>:</span> user_set = copy.copy(red.smembers(<span>"gs_newmsg_list"</span>)) msg_data = {} <span>for</span> uid <span>in</span> user_set: gm_account = red.get(<span>"gs_usernum:%s:friend"</span> % uid) <span>if</span><span>not</span> gm_account: <span>#理论上是不会</span><span>continue</span> msg_list = pop_msg(uid, <span>"msg_from_gs"</span>) send_msg = MSG_SEPARATOR.join(msg_list) <span>if</span><span>not</span> send_msg: <span>continue</span><span>if</span><span>not</span> gm_account <span>in</span> msg_data: msg_data[gm_account] = [] msg_data[gm_account].append({<span>"uid"</span> : uid, <span>"msg"</span> : send_msg}) <span>#red.srem("gs_newmsg_list", uid)</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"data"</span>: base64.b64encode(dumps(msg_data))}) <span><span>def</span><span>pop_msg</span><span>(uid, msg_type)</span>:</span> msg_list = [] msg_key = <span>"gs_usernum:%s:%s"</span> % (uid, msg_type) msg_len = min(MAX_RECV_AMOUNT, red.llen(msg_key)) <span>for</span> i <span>in</span> xrange(msg_len): piece_msg = red.rpop(msg_key) msg_list.append(piece_msg) <span>return</span> msg_list <span>#---------------------GS----------------------</span><span>#apply and remove</span><span><span>def</span><span>get_frd_relation</span><span>(env, params)</span>:</span> host = params[<span>"host"</span>] apply_user_set = copy.copy(red.smembers(<span>"apply_frd_list"</span>)) apply_data = {} <span>#{"res":1 "data":base64({uid: gm_account})}</span><span>for</span> uid <span>in</span> apply_user_set: hostnum = red.get(<span>"gs_usernum:%s:hostnum"</span> % uid) <span>if</span> hostnum != host: <span>continue</span> account_id = red.get(<span>"gs_usernum:%s:friend"</span> % uid) <span>if</span><span>not</span> account_id: <span>#error </span><span>continue</span> apply_data[uid] = [account_id, red.get(<span>"gm_account:%s:name"</span> % account_id)] red.srem(<span>"apply_frd_list"</span>, uid) del_user_list = red.hkeys(<span>"remove_frd_list"</span>) remove_list = [] <span>for</span> uid <span>in</span> del_user_list: hostnum = red.hget(<span>"remove_frd_list"</span>, uid) <span>if</span> hostnum != host: <span>continue</span> remove_list.append(uid) red.hdel(<span>"remove_frd_list"</span>, uid) <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"apply_data"</span>: base64.b64encode(dumps(apply_data)), <span>"remove_data"</span>: base64.b64encode(dumps(remove_list))}) <span><span>def</span><span>gs_sendmsg</span><span>(env, params)</span>:</span> uid, msg = params[<span>"uid"</span>], urllib.unquote(params[<span>"msg"</span>]) <span>if</span><span>not</span> red.get(<span>"gs_usernum:%s:friend"</span> % uid): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>5</span>}) <span># the usernum has friend but isn't the gm or doesn't have</span> red.lpush(<span>"gs_usernum:%s:msg_from_gs"</span> % uid, msg) red.sadd(<span>"gs_newmsg_list"</span>, uid) <span>#gm get msg from this set</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) <span><span>def</span><span>gs_receivemsg</span><span>(env, params)</span>:</span> host = params[<span>"host"</span>] user_set = copy.copy(red.smembers(<span>"gm_newmsg_list"</span>)) total_msg_list = [] <span>for</span> uid <span>in</span> user_set: hostnum = red.get(<span>"gs_usernum:%s:hostnum"</span> % uid) <span>if</span> hostnum != host: <span>continue</span> msg_list = pop_msg(uid, <span>"msg_from_gm"</span>) user_msg = MSG_SEPARATOR.join(msg_list) <span>if</span><span>not</span> user_msg: <span>continue</span> msg_data = { <span>"uid"</span> : uid, <span>"msg"</span> : user_msg, } total_msg_list.append(msg_data) <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"data"</span>: base64.b64encode(dumps(total_msg_list))}) <span><span>def</span><span>get_online_list</span><span>(env, params)</span>:</span> host = params[<span>"host"</span>] send_list = [] online_list = red.smembers(<span>"gm_online_list"</span>) <span>for</span> account_id <span>in</span> online_list: frd_set = red.smembers(<span>"gm_account:%s:friend"</span> % account_id) <span>for</span> uid <span>in</span> frd_set: <span>if</span> red.get(<span>"gs_usernum:%s:hostnum"</span> % uid) == host: send_list.append(account_id) <span>#只有这个服务器有gm的好友,才通知</span><span>break</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"data"</span>: base64.b64encode(dumps(send_list))}) <span>#get: action=create&gm_account&gm_name 创建账号</span><span>#get: action=add&gm_account&host&uid 添加好友</span><span>#get: action=del&gm_account&uid 删除好友</span><span>#get: action=online&gm_account上线</span><span>#get: action=offline&gm_account 下线</span><span>#get: action=send&gm_account&uid&msg 发送消息</span><span>#get: action=receive 轮训消息</span> GM_FUNC = { <span>"create"</span> : gm_create_account, <span>"add"</span> : gm_add_friend, <span>"del"</span> : gm_remove_friend, <span>"online"</span> : gm_online, <span>"offline"</span> : gm_offline, <span>"send"</span> : gm_sendmsg, <span>"receive"</span> : gm_receivemsg, } <span><span>def</span><span>handle_gm_ticket</span><span>(env, params)</span>:</span><span>if</span><span>not</span> gGMIP.get(env[<span>"REMOTE_ADDR"</span>], <span>0</span>): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, <span>"%s has no access to the website"</span> % env[<span>"REMOTE_ADDR"</span>] func = GM_FUNC.get(params[<span>"action"</span>], <span>None</span>) <span>if</span><span>not</span> func: <span>return</span> HTTP_STATUS[<span>404</span>], CONTENT_TYPE, <span>"err action %s"</span> % params[<span>"action"</span>] <span>return</span> func(env, params) <span>#get action=relation&host</span><span>#get action=send&uid&msg</span><span>#get action=receive&host</span><span>#get action=online&host </span> GS_FUNC = { <span>"relation"</span> : get_frd_relation, <span>"send"</span> : gs_sendmsg, <span>"receive"</span> : gs_receivemsg, <span>"online"</span> : get_online_list, } <span><span>def</span><span>handle_gs_ticket</span><span>(env, params)</span>:</span><span>if</span><span>not</span> gServerIP.get(env[<span>"REMOTE_ADDR"</span>], <span>0</span>): <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, <span>"%s has no access to the website"</span> % env[<span>"REMOTE_ADDR"</span>] func = GS_FUNC.get(params[<span>"action"</span>], <span>None</span>) <span>if</span><span>not</span> func: <span>return</span> HTTP_STATUS[<span>404</span>], CONTENT_TYPE, <span>"err action %s"</span> % params[<span>"action"</span>] <span>return</span> func(env, params) </code>
Urheberrechtserklärung: Dieser Artikel ist ein Originalartikel des Bloggers und nicht vom Blogger autorisiert. Eine Vervielfältigung ist nicht gestattet.
Das Obige stellt die Verwendung von nginx uwsgi redis zum Implementieren der GM-Chat-Funktion des Spiels vor, einschließlich Aspekten des Spiels. Ich hoffe, dass es für Freunde hilfreich sein wird, die an PHP-Tutorials interessiert sind.

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Die Verwendung von return in der C-Sprache ist: 1. Für Funktionen, deren Rückgabewerttyp ungültig ist, können Sie die Rückgabeanweisung verwenden, um die Ausführung der Funktion vorzeitig zu beenden. 2. Für Funktionen, deren Rückgabewerttyp nicht ungültig ist, ist die Funktion von Die Return-Anweisung dient dazu, die Ausführung der Funktion zu beenden. 3. Beenden Sie die Ausführung der Funktion vorzeitig wenn die Funktion keinen Wert zurückgibt.

Quellcode: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}# Ausgabe Die Ausgabe des obigen Codes kann einfach zu dem Schluss kommen: return wird ausgeführt, bevor wir uns schließlich ansehen, was auf der Bytecode-Ebene passiert. Im Folgenden wird ein Teil des Bytecodes der Methode case1 abgefangen und mit dem Quellcode verglichen, um die Bedeutung jeder Anweisung darin zu kommentieren

Welche Währung ist MSG? MSG ist eine Kryptowährung, deren vollständiger Name MessageCoin ist. Es handelt sich um eine digitale Währung, die auf der Blockchain-Technologie basiert und die Merkmale Dezentralisierung, Anonymität und Sicherheit aufweist. Die Mission von MSG besteht darin, sichere und effiziente Peer-to-Peer-Kommunikation und Wertetransfer auf globaler Ebene zu fördern. Lohnt es sich, in MSG Coin zu investieren? Eine Investition in MSG Coin erfordert eine umfassende Berücksichtigung mehrerer Faktoren, darunter Marktaussichten, technische Stärke und Teamhintergrund. Das Marktpotenzial von MSG-Coins hat viel Aufmerksamkeit erregt. Da sich die Kryptowährungsbranche rasant entwickelt, steigt die weltweite Nachfrage nach dezentraler Kommunikation und Zahlungen weiter. Als digitale Währung mit Fokus auf Kommunikation und Werttransfer bietet MSG vielfältige Einsatzmöglichkeiten. Die technische Stärke der MSG-Münze ist auch einer der wichtigen Faktoren, die Benutzer anziehen.

Vue3.2-Setup-Syntaxzucker ist ein Syntaxzucker zur Kompilierungszeit, der die kombinierte API in einer einzelnen Dateikomponente (SFC) verwendet, um das umständliche Setup in Vue3.0 zu lösen. Die durch den Import eingeführten deklarierten Variablen, Funktionen und Inhalte werden bereitgestellt Rückkehr, damit sie in Vue3.0 verwendet werden können. 1. Es besteht keine Notwendigkeit, deklarierte Variablen, Funktionen und Inhalte zurückzugeben, die durch Import während der Verwendung eingeführt wurden }from'./utils'//variable constmsg='Hello !'//function func

JavaScript-Funktionen stellen zwei Schnittstellen zur Interaktion mit der Außenwelt bereit. Die Parameter dienen als Eingang zum Empfang externer Informationen; der Rückgabewert dient als Ausgang für die Rückmeldung der Operationsergebnisse an die Außenwelt. Der folgende Artikel wird Ihnen helfen, den Rückgabewert der JavaScript-Funktion zu verstehen und die Verwendung der Rückgabeanweisung kurz zu analysieren. Ich hoffe, er wird Ihnen hilfreich sein!

Bei der Rückgabe des Python-Rückgabewerts wird die Ausführung sofort gestoppt, wenn die Funktion die Rückgabeanweisung ausführt, und der angegebene Wert wird an die Stelle zurückgegeben, an der die Funktion aufgerufen wurde. Detaillierte Verwendung: 1. Einen einzelnen Wert zurückgeben; 2. Einen Nullwert zurückgeben; 4. Die Ausführung der Funktion vorzeitig beenden;

Für die Verwendung von „return“ in JavaScript sind bestimmte Codebeispiele erforderlich. In JavaScript wird die „return“-Anweisung verwendet, um den von einer Funktion zurückgegebenen Wert anzugeben. Es kann nicht nur dazu verwendet werden, die Ausführung einer Funktion zu beenden, sondern auch einen Wert an die Stelle zurückzugeben, an der die Funktion aufgerufen wurde. Die Return-Anweisung hat die folgenden allgemeinen Verwendungszwecke: Einen Wert zurückgeben Die Return-Anweisung kann verwendet werden, um einen Wert an die Stelle zurückzugeben, an der die Funktion aufgerufen wird. Hier ist ein einfaches Beispiel: functionadd(a,b){

Für die Verwendung von return in JavaScript sind bestimmte Codebeispiele erforderlich. In JavaScript ist return ein sehr wichtiges Schlüsselwort. Es wird normalerweise verwendet, um einen Wert in einer Funktion zurückzugeben oder die Ausführung einer Funktion zu beenden. Die Return-Anweisung wird verwendet, um einen Wert an den Aufrufer der Funktion zurückzugeben und die Ausführung der Funktion zu beenden. Die return-Anweisung kann überall in einer Funktion verwendet werden und jeden JavaScript-Datentyp zurückgeben, einschließlich Zahlen, Zeichenfolgen, booleschen Werten,
