如何本地創建websocket服務端并發布到公網實現遠程訪問

文章目錄

        • 1. Java 服務端demo環境
        • 2. 在pom文件引入第三包封裝的netty框架maven坐標
        • 3. 創建服務端,以接口模式調用,方便外部調用
        • 4. 啟動服務,出現以下信息表示啟動成功,暴露端口默認9999
        • 5. 創建隧道映射內網端口
        • 6. 查看狀態->在線隧道,復制所創建隧道的公網地址加端口號
        • 7. 以基于go的socket客戶端為例,通過公網連接java socket服務端
        • 8. 通過git下載websocket框架
        • 9. 創建客戶端, 注意:Host值為上面復制的隧道公網地址!!
        • 10. 接著啟動服務,與服務端連接,出現服務端返回的字樣表示連接成功
        • 11. 客戶端在控制臺輸入信息,回車
        • 12. 服務端出現客戶端發送的信息
        • 13. 服務端控制臺輸入消息,回車
        • 14. 客戶端收到服務端回復的消息,連接成功

1. Java 服務端demo環境
  • jdk1.8
  • 框架:springboot+maven
  • 工具IDEA
2. 在pom文件引入第三包封裝的netty框架maven坐標
<dependency><groupId>io.github.fzdwx</groupId><artifactId>sky-http-springboot-starter</artifactId><version>0.10.6</version>
</dependency>

注意:pom文件里需注釋掉springbootweb啟動器,web啟動器默認是tomcat服務啟動,會和netty服務沖突

20221220152746

3. 創建服務端,以接口模式調用,方便外部調用
@GetMapping("/getConnect")
public void getConnect(HttpServerRequest request){request.upgradeToWebSocket(ws -> {ws.mountOpen(h->{ws.send("連接成功,開始聊天吧!");});ws.mountText(s -> {System.out.println(s);//對方回復System.out.println("客戶端回復: "+s);//獲取控制臺輸入的值Scanner scanner =new Scanner(System.in);String next = scanner.next();ws.send(next);});});}
4. 啟動服務,出現以下信息表示啟動成功,暴露端口默認9999

20221220152808

5. 創建隧道映射內網端口

這里我們用cpolar內網穿透來映射內網端口,它支持http/https/tcp協議,不限制流量,無需公網ip,也不用設置路由器,操作簡單。

  • cpolar一鍵安裝腳本:(國內用戶)
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
  • 或短鏈接安裝方式:(國外用戶)
curl -sL https://git.io/cpolar | sudo bash
  • 查看cpolar版本信息
cpolar version

如果正常顯示,則安裝成功

  • cpolar進行token認證

cpolar官網:https://www.cpolar.com/

進入cpolar官網,注冊一個賬號并登錄進入后臺,點擊左側的驗證,可以查看到token碼,復制并執行命令進行認證

cpolar authtoken xxxxxxxxxxxxxxxxxx
  • 配置cpolar開機自啟動
sudo systemctl enable cpolar
  • 守護進程方式,啟動cpolar
sudo systemctl start cpolar
  • 查看cpolar守護進程狀態,如正常為active,則為正常啟動狀態
sudo systemctl status cpolar

cpolar安裝成功后,默認會配置兩個默認隧道:一個ssh隧道和一個website隧道,可自行刪減或者修改。

接著把本地服務通過cpolar暴露到公網,瀏覽器訪問http://127.0.0.1:9200,登錄cpolar web ui 界面,創建一個tcp隧道,指向9999端口

20221220152822

注意:該隧道選擇的是臨時tcp地址和端口,24小時內會變化,如需固定tcp地址,可升級為專業套餐做tcp地址固定!

6. 查看狀態->在線隧道,復制所創建隧道的公網地址加端口號

20221220152843

此時,websocket服務端已經從本地localhost暴露至公網,接著我們創建一個客戶端測試公網訪問socket服務端連接

7. 以基于go的socket客戶端為例,通過公網連接java socket服務端
  • go版本:1.19
  • 工具:vscode
8. 通過git下載websocket框架
go get github.com/gorilla/websocket

20221220152904

9. 創建客戶端, 注意:Host值為上面復制的隧道公網地址!!
package mainimport ("fmt""log""net/url""github.com/gorilla/websocket"
)func main() {// 定義服務端的地址u := url.URL{Scheme: "ws",Host:   "3.tcp.vip.cpolar.cn:10793", //地址為復制隧道的公網地址Path:   "/eth/getConnect"} //服務端controller 映射地址// 與服務端建立連接c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {log.Fatal("dial:", err)}defer c.Close()// 阻塞主線程down := make(chan byte)// 啟動一個線程,讀取從服務端發送過來的數據go func() {for {_, message, _ := c.ReadMessage()fmt.Println("服務端回復:" + string(message))}}()//啟動一個線程輸入消息go func() {for {var input stringfmt.Scanln(&input)c.WriteMessage(websocket.TextMessage, []byte(input))}}()for {<-down}
}
10. 接著啟動服務,與服務端連接,出現服務端返回的字樣表示連接成功

20221220152924

11. 客戶端在控制臺輸入信息,回車

20221220152933

12. 服務端出現客戶端發送的信息

20221220152943

13. 服務端控制臺輸入消息,回車

20221220152951

14. 客戶端收到服務端回復的消息,連接成功

20221220153000

需要注意,免費使用cpolar所生成的公網地址為隨機臨時地址,24小時內會發生變化。如果需要長期遠程連接,建議為其配置固定的tcp端口地址。即登錄cpolar官網后,點擊預留,保留一個固定tcp端口地址,然后將其配置到相應的隧道中即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719173.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何實現飛書與金蝶無縫對接,提升業務效率與客戶滿意度?

一、客戶介紹 某貿易有限公司是一家專業從事進口葡萄酒和高端烈酒銷售的企業。在市場競爭日益激烈的今天&#xff0c;該公司始終堅持以客戶為中心&#xff0c;以市場為導向&#xff0c;不斷創新和進步。公司不僅注重傳統銷售渠道的拓展&#xff0c;還積極擁抱互聯網&#xff0…

processing繪制笑臉

笑臉效果圖&#xff1a; processing代碼&#xff1a; void setup(){size(1000,1000);//Canvas sizebackground(#ffcc33);//Canvas background color } void draw(){ strokeWeight(12);//face-width12px fill(#ffffcc);//face arc(500,500,200,200,0,TWO_PI);//face-size strok…

Python中的自然語言處理和文本挖掘

在Python中&#xff0c;自然語言處理&#xff08;NLP&#xff09;和文本挖掘通常涉及對文本數據進行清洗、轉換、分析和提取有用信息的過程。Python有許多庫和工具可以幫助我們完成這些任務&#xff0c;其中最常用的包括nltk&#xff08;自然語言處理工具包&#xff09;、spaCy…

統計C語言代碼行數的pyton代碼

首先是白嫖以下大神的代碼&#xff1a;統計python代碼行數小工具_linecount工具-CSDN博客 然后&#xff0c;讓ChatGPT幫我改為如下的完整代碼&#xff1a; import os from tkinter import Tk, Label, Button, filedialog def open_file(file_path, encoding): try: file op…

【推薦算法系列十八】:DSSM 召回算法

參考 推薦系統中 DSSM 雙塔模型匯總&#xff08;二更&#xff09; DSSM 和 YouTubeDNN 都是比較經典的 U2I 模型。 U2I 召回 U2I 召回也就是 User-to-Item 召回&#xff0c;它基于用戶的歷史行為以及用戶的一些個人信息&#xff0c;對系統中的候選物品進行篩選&#xff0c;挑…

備考2024年上海高考數學:歷年選擇題真題練一練(2014~2023)

今天距離2024年高考還有三個多月的時間&#xff0c;今天我們來看一下2014~2023年的上海高考數學的選擇題&#xff0c;從過去十年的真題中隨機抽取5道題&#xff0c;并且提供解析。 后附六分成長獨家制作的在線練習集&#xff0c;科學、高效地反復刷這些真題&#xff0c;吃透真題…

Dockerfile執行的時候沒有執行CMD

參考&#xff1a;https://blog.csdn.net/Zx13170918986/article/details/130831052 在dockerfile中編寫CMD后&#xff0c;發現如果執行docker run -itd這樣的指令&#xff0c;是沒法啟動CMD腳本的&#xff0c;例如以下的dockerfile FROM node:16 WORKDIR /home/ COPY start_…

Sora爆火,數字人IP如何借助AIGC視頻生成軟件制作短視頻營銷?

ChatGPT、Sora等大模型的出現&#xff0c;創新了短視頻內容創作生產方式。但目前Sora模型無法準確模擬復雜場景的物理特性&#xff0c;并且可能無法理解因果關系導致視頻失真。 廣州虛擬動力基于用戶使用需求&#xff0c;推出了AIGC數字人視頻生成平臺&#xff0c;企業、品牌可…

c++基礎學習第三天(指針,結構體)

c基礎學習第三天&#xff08;指針&#xff0c;結構體&#xff09; 文章目錄 1、指針1.1、指針的基本概念1.2、指針變量的定義和使用1.3、 指針所占內存空間1.4、空指針和野指針1.5、 const修飾指針1.5.1、const修飾指針-常量指針1.5.2、const修飾常量-指針常量1.5.3、const即修…

Android MediaCodec 簡明教程(五):使用 MediaCodec 編碼 ByteBuffer 數據,并保存為 MP4 文件

系列文章目錄 Android MediaCodec 簡明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查詢 Codec 信息&#xff0c;并創建 MediaCodec 編解碼器Android MediaCodec 簡明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

php:實現字符串補零str_pad()

說明 str_pad($input_string, $total_length, $pad_string, $pad_type); $input_string 是要填充的原始字符串。$total_length 是填充后的字符串總長度&#xff0c;包括原始字符串的長度。$pad_string 是用于填充的字符&#xff0c;通常是零。$pad_type 是填充的位置&#xff0…

欲哭無淚,2024年軟考有變!中高項只考1次了

今天可能最重磅的消息是&#xff1a;2024年軟考工作安排及有關事項的通知文件在瘋傳&#xff0c;這份文件中提到了&#xff1a; 軟考高級方面&#xff1a; 信息系統項目管理師從2次改為了1年只考1次&#xff0c;放在了上半年考。 系統規劃與管理師依然保持1次&#xff0c;但是…

每日一練:LeeCode-707. 設計鏈表 【鏈表+虛擬頭結點+設計】

每日一練&#xff1a;LeeCode-707. 設計鏈表 【鏈表虛擬頭結點設計】 思路設置虛擬頭節點 本文是力扣 每日一練&#xff1a;LeeCode-707. 設計鏈表 【鏈表虛擬頭結點設計】 學習與理解過程&#xff0c;本文僅做學習之用&#xff0c;對本題感興趣的小伙伴可以出門左拐LeeCode-70…

0101二階與三階行列式-行列式-線性代數

一 引例 求解二元一次方程組 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1\\ a_{21}x_1a_{22}x_2b_2\\ \end{cases} {a11?x1?a12?x2?b1?a21?x1?a22?x2?b2?? 解&#xff1a; 1 a 21 ? 2 a 11 ? x 2 a 11 b 2 ? a…

Python函數的閉包

嵌套函數 在一個函數內部定義的函數稱為嵌套函數 閉包的形成 內層函數對外層函數非全局變量的引用就會形成閉包 閉包作用 保證數據安全 例子 li [] def average(value):li.append(value)return sum(li)/len(li) 如上面代碼li[]這個列表人人都能修改&#xff0c;這樣就…

自然語言處理實戰項目26-NLP模型訓練中前置應用之分詞方法的應用

大家好,我是微學AI,今天給大家介紹一下自然語言處理實戰項目26-NLP模型訓練中前置應用之分詞方法的應用。本文詳細介紹了自然語言處理(NLP)模型訓練中前置應用之分詞方法的應用。文章首先簡要概述了NLP的概念和分詞在其中的重要性。隨后,文章詳細介紹了四種主要的分詞方法…

MQL5學習之簡單移動平均線MA的編寫

昨天還是有點高估自己了&#xff0c;MACD相對較難一點&#xff0c;改學MA的編寫&#xff0c;首先明確MA的計算&#xff0c;假如有4個值&#xff0c;p[1&#xff0c;2&#xff0c; 3&#xff0c; 4], period3, 則v[0]p[0], v[1]p[1],v[2](p[0]p[1]p[2])/32, v[3](v[2]*3p[3]-p…

瀏覽器展示Blob/File文件

1. 瀏覽器展示Blob/File文件 I.Blob格式轉Base64格式 當我們接收到后端傳輸過來的文件時&#xff0c;很多時候我們需要將傳過來的文件轉為Base64格式。如后端傳來驗證碼圖片時等 下面將提供函數&#xff1a; // Blob轉Base64 export const blobToBase64 (blob: Blob) >ne…

ChatGPT論文指南|ChatGPT如何助力論文中的數據分析!【建議收藏】

點擊下方▼▼▼▼鏈接直達AIPaperPass &#xff01; AIPaperPass - AI論文寫作指導平臺 公眾號原文▼▼▼▼&#xff1a; ChatGPT論文指南|ChatGPT如何助力論文中的數據分析&#xff01;【建議收藏】 小編在之前的論文寫作流程中&#xff0c;介紹了大量論文文字工作&#xff…

Effective objective-c-- 內存管理

Effective objective-c-- 內存管理 前言理解引用計數引用計數工作原理屬性存取方法中的內存管理自動釋放池保留環要點 以ARC簡化引用計數使用ARC時必須遵循的方法和命名規則變量的內存管理語義ARC如何清理實例變量覆寫內存管理方法要點 在dealloc方法中只釋放引用并解除監聽要點…