文章目錄
- 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服務沖突
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
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端口
注意:該隧道選擇的是臨時tcp地址和端口,24小時內會變化,如需固定tcp地址,可升級為專業套餐做tcp地址固定!
6. 查看狀態->在線隧道,復制所創建隧道的公網地址加端口號
此時,websocket服務端已經從本地localhost暴露至公網,接著我們創建一個客戶端測試公網訪問socket服務端連接
7. 以基于go的socket客戶端為例,通過公網連接java socket服務端
- go版本:1.19
- 工具:vscode
8. 通過git下載websocket框架
go get github.com/gorilla/websocket
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. 接著啟動服務,與服務端連接,出現服務端返回的字樣表示連接成功
11. 客戶端在控制臺輸入信息,回車
12. 服務端出現客戶端發送的信息
13. 服務端控制臺輸入消息,回車
14. 客戶端收到服務端回復的消息,連接成功
需要注意,免費使用cpolar所生成的公網地址為隨機臨時地址,24小時內會發生變化。如果需要長期遠程連接,建議為其配置固定的tcp端口地址。即登錄cpolar官網后,點擊預留,保留一個固定tcp端口地址,然后將其配置到相應的隧道中即可。