顯示具有 WebSocket 標籤的文章。 顯示所有文章
顯示具有 WebSocket 標籤的文章。 顯示所有文章

2020年2月5日 星期三

使用 nginx websocket https to http

最近專案遇到一坑,之前 http 使用 ws 都很順利,但是上了https之後,網頁強制要使用 wss... 就卡住了
Nginx 配置 轉發代理,網路上很多教學都寫一半,最後看懂就~ 這樣寫最精簡,直接 調用ws 去處理後續的東西

NGINX配置文件
server {
    server_name             域名;

    location / {
        root                   PATH;
        index                  index.php index.html index.htm;
        try_files              $uri $uri/ /index.php?$query_string;
    }
 
    location ~ \.php$ {
        root                   PATH;
        fastcgi_pass           unix:/var/run/php-fpm/www.sock;
        fastcgi_index          index.php;
        fastcgi_param          SCRIPT_FILENAME
        $document_root$fastcgi_script_name;
        111111
        include                fastcgi_params;
    }
 
    listen                  443 ssl; # managed by Certbot
    ssl_certificate         證書
    ssl_certificate_key     證書
    include                 /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam             /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 
    location / {
        proxy_pass             服務位置
        #例如                    http://127.0.0.1:8092/ws;
        proxy_http_version     1.1;
        proxy_set_header       Upgrade $http_upgrade;
        proxy_set_header       Connection "Upgrade";
        proxy_set_header       X-Real-IP $remote_addr;
        add_header             Access-Control-Allow-Origin *;
        proxy_connect_timeout  60s;
        proxy_read_timeout     500s;
        proxy_send_timeout     500s;
    }
 
}
server {
    if ($host = 域名) {
        return                 301 https://$host$request_uri;
        }                      # managed by Certbot
 
        listen                 80;
 
        server_name            域名;
        return                 404; # managed by Certbot
 
    }
Go Server
package main

import (
    "log"
    "net/http"
 
    "github.com/gorilla/websocket"
)
 
func main() {
    upgrader := &websocket.Upgrader{
        //如果有 cross domain 的需求,可加入這個,不檢查 cross domain
        CheckOrigin: func(r *http.Request) bool { return true },
    }
    http.HandleFunc("/"func(w http.ResponseWriter, r *http.Request) {
        cerr := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Println("upgrade:", err)
            return
        }
        defer func() {
            log.Println("disconnect !!")
            c.Close()
        }()
        for {
            mtypemsgerr := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                break
            }
 
            log.Printf("receive: %s\n", msg)
            msg = []byte("伺服器接收成功")
            log.Printf("re_send: %s\n", msg)
 
            err = c.WriteMessage(mtype, msg)
            if err != nil {
                log.Println("write:", err)
                break
            }
        }
    })
    log.Println("server start at :8000")
    log.Fatal(http.ListenAndServe(":8000"nil))
}
Go Client
package main

import (
    "log"
 
    "github.com/gorilla/websocket"
)
 
func main() {
    // ws_connection := "ws://fishstg.1c5game.com:8000/echo"
    // ws_connection := "wss://18.139.24.117:8092/ws"
    ws_connection := "wss://fishstg.1c5game.com/ws"
    // ws_connection := "wss://echo.websocket.org/"
    log.Printf("ws_connection: %s\n", ws_connection)
    c_err := websocket.DefaultDialer.Dial(ws_connection, nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()
 
    i := 1
    for i <= 10 {
        // fmt.Println(i)
        send_msg := "{\"protocol\"  : \"platform_debit_all\",  \"data\"  :{ \"id\":1 , \"gametoken\":123456465 }}"
        log.Printf("send_msg: %s\n", send_msg)
        err = c.WriteMessage(websocket.TextMessage, []byte(send_msg))
        if err != nil {
            log.Println(err)
            return
        }
        _msgerr := c.ReadMessage()
        if err != nil {
            log.Println("read:", err)
            return
        }
        log.Printf("received: %s\n", msg)
        i++
    }
}
----------------------

2019年12月12日 星期四

PHP~當客戶端喔

一個寧靜的下午
遇到一個要由PHP 當 客戶端的情境
往往都是PHP 當伺服器在接收客戶端的服務
這次反過來要去當客戶端
發送訊息給另一個伺服器
服務的伺服器為WebSocket Server
這個要搭建起來用PHP + Html5 根本無難度
但是要由PHP send message .... 一直卡住
翻尋許久,求助大大神
最後滑倒後踢到垃圾桶,踩到黃金等等
發現了
# "textalk/websocket
  # use WebSocket\Client;
  # composer  require textalk/websocket
開心的加載進去,剩下的就差不多了....
$client = new Client("ws://" . $this->input->server('HTTP_HOST') . ":".'port');
$client->send('47b6"}}');
$client->receive();
<途中插曲>
Port 忘記打開.... 所以一直連接不上

2019年12月4日 星期三

WebSocket 壓力測試 Example(多執行緒)

使用工具 :
Python 3.8
程式碼:
import websocket
try:
    import thread
except ImportError:
    import _thread as thread
import time
import threading
import json

"""
這是一個卡 WebSocket 的 Example
"""

def on_message(ws, message):
    # parse x:
    message = json.loads(message)
    print("message", message, "\n")
    print("\n");


def on_error(ws, error):
    # print(error)
    print("error", error, "\n")


def on_close(ws):
    print("### closed ###")

def on_open(ws):
    print("ws coennet...")
    # def run(*args):
    #     print("ws coennet...")
    #     # for i in range(3):
    #     #     time.sleep(1)
    #     #     ws.send("Hello %d" % i)
    #     # time.sleep(1)
    #     # ws.close()
    #     print("thread terminating...")
    # thread.start_new_thread(run, ())


def run_s(i):
    websocket.enableTrace(True)
    wsc = "接口"
    ws = websocket.WebSocketApp(wsc,
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()


if __name__ == "__main__":
    # 建立 5 個子執行緒
    num = 1
    threads = []
    for i in range(num):
        threads.append(threading.Thread(target=run_s, args=(i,)))
        threads[i].start()
    # 等待所有子執行緒結束
    for i in range(num):
        threads[i].join()

    print("Done.")

拯救老電腦

 Sempron 3850 Socket AM1入門四核處理器 2014 8ram  作業系統 windows 10 1904 評論: 八年的核心,其他的故障電腦拆解零組件都是拼裝. 整體使用上,可以基本文書,瀏覽網站,聽音樂等等都可以接受的。 下次再來繼續搞更多..