跳到主要內容

精選

遊戲伺服器2025年初架設與研究part14收送封包的Json格式與Unity內建JsonUtility相關的問題(支援性)

 上次針對如何在Unity的新版TMP Text中使用中文字 而這次則是來分享一下先前有提過的 Json文字轉換 的問題 首先我們知道Unity內建的Json轉換是 JsonUtility JsonUtility 在使用上有一些限制在 算是有優點也有缺點 優點是畢竟是寫在Unity底層的, 效能 比較好 如果功能沒有問題的情況下,可以比額外安裝的Json轉換插件效能要好上不少 甚至有些插件能差兩倍以上的執行效能 不過自然也是有缺點 就是它有不少 不支援 的型別 很多時候常常讓伺服器與遊戲端的人打架的其中一個原因,伺服器表示資料明明就有送,遊戲端則是表示我沒收到(伺服器傳的Json格式轉不出來的種種問題或是可能性) 詳細可以參考Unity的官方文件 https://docs.unity3d.com/6000.1/Documentation/Manual/json-serialization.html 那我這邊也把一些重點特別拿出來講 首先我們先前在聊天訊息回傳的時候,就已經有用到基本的功能 可以先看到我們伺服器端的程式碼(Python) 如以上這語法 這是我們先前使用的方式 那這邊因為是跟先前相同的 相同的部分我就用截圖來顯示(詳細程式碼在Part11有可以複製) 可以看到我們主要回傳的結構 json.dumps({"type": "chat", "message": msg}) 這段就是把後面的內容透過Json轉換成Json字串後傳給使用者(遊戲端) 而我們Unity接收的位置是這樣寫的 ServerPacket packet = JsonUtility.FromJson<ServerPacket>(json); 這行就是我們今天 主要 想討論的地方 並且假設大家想要使用額外安裝的Json套件,也幾乎就是替換這行就能達到想要的效果 接下來我們看到ServerPacket這個class 這邊可以看到關鍵是我們的class要 可序列化 也就是說要加上 [Serializable] 那雖然說是只要加上可序列化,就能轉換 但是也是因為這樣,有很多不能被Unity內建支援的型別,則會轉換不出來 而...

遊戲伺服器2025年初架設與研究part9簡單介紹Gunicorn + Flask與Uvicorn + FastAPI並簡單架設

 先前針對我們Nginx的搭配使用

已經可以簡單的做到基本的https設置

那接下來分別進行兩組插件進行分享

分別是Gunicorn + Flask

跟Uvicorn + FastAPI

首先簡單介紹一下這兩個組合主要功能是應對什麼

兩個組合都可以很好的應用在伺服器運行上

舉例來說Flask跟FastAPI就是框架的腳色

而Gunicorn 跟Uvicorn 則是伺服器的腳色,也就是啟動Http服務等等

並且主要的部署方式為systemd + Nginx + Supervisor

先前已經有使用了systemd + Nginx

首先兩者都有各自的優缺點

不過Uvicorn + FastAPI算是比較年輕的,是比較新的插件

所以要當伺服器功能的話能查到比較多資料的是Gunicorn + Flask

主要差異的話FastAPI是異步運行(非同步)

而Flask則是同步運行

所以理論上效能FastAPI會比較好


這邊也簡單的介紹一下兩種用法

首先是安裝

安裝前記得先切到虛擬環境之中(前面有帶venv)

pip install flask gunicorn


from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/")
def hello():
    return jsonify(message="Hello, Flask + Gunicorn!")

if __name__ == "__main__":
    app.run()


新增一個python檔案寫入以上的內容,python檔案假設取名為main.py

其中最後的__name__的部分是直接執行python才會使用到

不過剛開始可以直接執行先測試看看有沒有直接報錯(之後可以拿掉)

接下來可以到我們的Nginx,這邊新增設定檔可以參考先前的文章

那主要就是以下的指令

sudo nano /etc/nginx/sites-available/各自的設定檔名稱


server_name 自己的網域 www.自己的網域;

    location / {
        proxy_pass http://127.0.0.1:7899;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }


7899可替換自己想要監聽的port

接下來請建立服務檔來執行,當然這邊也可以透過gunicorn 指令直接執行

gunicorn --workers 4 --bind 0.0.0.0:7899 main:app

那加到服務中就可以開機後自動啟動

如以下方式

sudo nano /etc/systemd/system/your_main.service

這邊服務新增方式如同之前有講過的,是一樣的東西

先建立一個服務檔案,接下來在裡面輸入以下內容


[Unit]
Description=Flask Gunicorn
After=network.target
[Service]
User=自己的User
Group=自己的Group(好像可以不用)
WorkingDirectory=/home/User/專案路徑(要執行的python位置)
ExecStart=/home/User/專案路徑/venv/bin/gunicorn --bind 127.0.0.1:7899 main:app

Restart=always
Environment="PATH=/home/User/專案路徑/venv/bin"

[Install]
WantedBy=multi-user.target


關鍵就是ExecStart的部分,那邊讓gunicorn去執行你的腳本

那這邊記得都使用虛擬環境下的路徑,如果沒有用虛擬環境則是找到對應路徑即可

服務檔案處理完畢後

sudo systemctl daemon-reload

先reload

接著是啟動你的服務檔

sudo systemctl enable your_main

sudo systemctl start your_main

記得檔名請換成自己取的

這樣就可以簡單的建立伺服器的效果(可以測試在瀏覽器輸入自己的網域)

當然需要什麼內容就可以在python內加入


接下來是

pip install fastapi uvicorn[standard]

一樣記得建議在虛擬環境中安裝

接下來一樣的使用步驟,整理算是非常相似

這邊一樣提供一個很簡單的範例

首先新增main.py

或是自己想要的名字,或是不想跟剛剛重覆名稱可以改個main2.py


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, FastAPI + Uvicorn!"}


裡面內容打這樣

並且如果想直接用指令執行腳本可以打以下的指令

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

那這邊只是測試使用就好,因為0.0.0.0會對所有IP的8000port都開放

測試可以運行就可以先關閉了

那接下來一樣是去調整Nginx設定檔

sudo nano /etc/nginx/sites-available/各自的設定檔名稱

並在設定檔的區域加入以下內容


server_name 自己的網域 www.自己的網域;
location / {
        proxy_pass http://127.0.0.1:7899/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }


這邊沒有限制不能與先前的Flask共用

但是要注意port要分開,並且不能監聽同一個網址

也就是說如果兩種都想要用其中一個的location /要改成別的

這邊舉例可以換成location /uvicorn/

不過瀏覽的時候就要記得網域後面要記得加/uvicorn

這樣才看的到這邊的內容,並且上面的server_name只要加一次

不用重複加兩次server_name

接下來一樣是服務檔的新增

這邊如果大家想跟上面的設定檔都保留的話,可以設置不同的檔名

當然如果希望先中止服務也可以輸入以下的指令來先中止服務

sudo systemctl stop  自己要中止的服務檔.service

這邊同時運行多個服務也不會有問題,所以先前的保持運行也沒問題

只要注意不要使用到同一個port跟location /


[Unit]
Description=FastAPI App via Uvicorn
After=network.target

[Service]
User=自己的User
Group=自己的Group(好像可以不用?)
WorkingDirectory=/home/User/專案路徑
Environment="PATH=/home/User/專案路徑/venv/bin"
ExecStart=/home/User/專案路徑/venv/bin/uvicorn \
main2:app \ --workers 4 \ --host 0.0.0.0 \ --port 7899 [Install] WantedBy=multi-user.target


之後透過一樣的方式

sudo systemctl daemon-reload

先reload接著是啟動你的服務檔

sudo systemctl enable 自己的服務檔名稱

sudo systemctl start 自己的服務檔名稱

運行後就可以去瀏覽器確認一下是否有看到內容

那如果運行有問題

這邊也提供可以看目前服務運行狀態的指令(可以看到執行錯誤)

sudo systemctl status 自己的服務檔名稱.service

那如果腳本有改,可以透過以下指令重新讀取後開啟

sudo systemctl restart 自己的服務檔名稱.service

那這樣這兩種伺服器就可以簡單的架設了出來

也可以透過對應的網域跟網域+自己輸入的網址來查看對應內容了


這次也就分享到這邊

兩種不同的方式都可以快速的架設出網站與伺服器,相當便利且好用

如果還有什麼疑問也可以提出,或是有什麼講錯的地方也歡迎指正









留言