目錄
- 一、websocket簡介
- 二、背景
- 三、優點
- 1、控制開銷
- 2、實時性更強
- 3、保持連接狀態
- 4、更好的二進制支持
- 5、支持擴展和更好的實作壓縮效果
- 四、原理
- 1、客戶端、服務器建立TCP連接,三次握手,
- 2、TCP連接成功后,客戶端通過HTTP協議向服務器傳送websocket支持的版本號資訊,(開始前的HTTP握手)
- 3、服務器收到客戶端的握手請求后,同樣采用HTTP協議回饋資料,
- 4、當收到了連接成功的訊息后,通過TCP通道進行傳輸通信,
- 五、websocket和socket的關系
- 六、通過IpIdea實作Socks5
- 1、ipidea簡介
- 全球領先的互聯網大資料IP資源
- 2、Socks5代理可以適用的業務場景
- 七、SuperWebSocket實作服務端
- 1、創建視窗程式,WindowsFormsWebsocketServer
- 2、添加程式包
- 3、代碼實體
- 八、WebSocket4Net實作客戶端
- 1、創建視窗程式,WindowsFormsWebsocketClient
- 2、添加程式包
- 3、代碼實體
- 九、客戶端向服務端發送訊息
- 1、客戶端
- 2、服務端
- 十、哪吒社區萬粉計劃
- 🍅 [Java學習路線總結,搬磚工逆襲Java架構師](https://blog.csdn.net/guorui_java/article/details/120098618)🍅
- 🍅 [Java學習路線總結,搬磚工逆襲Java架構師](https://blog.csdn.net/guorui_java/article/details/120098618)🍅
一、websocket簡介
websocket是一種在單個TCP連接上進行全雙工通信的協議,
websocket使得客戶端和服務器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料,在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并進行雙向資料傳輸,
二、背景
很多網站為了實作推送技術,所用的技術都是輪詢,
輪詢是在特定的時間間隔,由瀏覽器對客戶端發出HTTP請求,然后由服務器回傳最新的資料給客戶端的瀏覽器,這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然后HTTP請求可能包含較長的頭部,其中真正有效的資料可能只是很小的一部分,顯然這樣會浪費很多的寬帶等資源,
在這種情況下,HTML5定義了websocket協議,能更好的節省服務器資源和寬帶,而且能夠更實時地進行通訊,
三、優點
1、控制開銷
創建連接后,服務器和客戶端之間交換資料時,用于協議控制的資料包頭部相對較小,
2、實時性更強
由于協議是全雙工的,所以服務器可以隨時主動給客戶端下發資料,相對于HTTP請求需要等待客戶端發起請求服務端才能回應,延遲明顯更少,
3、保持連接狀態
與HTTP不同的是,Websocket需要先創建連接,這就使得其成為一種有狀態的協議,之后通信時可以省略部分狀態資訊,而HTTP請求可能需要在每個請求都攜帶狀態資訊(如身份認證等),
4、更好的二進制支持
5、支持擴展和更好的實作壓縮效果
四、原理
websocket同HTTP一樣也是應用層的協議,但是它是一種雙向通信協議,建立在TCP之上的,
連接程序(握手程序)
1、客戶端、服務器建立TCP連接,三次握手,
這是通信的基礎,傳輸控制層,若失敗后續都不執行,
2、TCP連接成功后,客戶端通過HTTP協議向服務器傳送websocket支持的版本號資訊,(開始前的HTTP握手)
3、服務器收到客戶端的握手請求后,同樣采用HTTP協議回饋資料,
4、當收到了連接成功的訊息后,通過TCP通道進行傳輸通信,
五、websocket和socket的關系
socket其實并不是一個協議,而是為了方便使用TCP和UDP而抽象出來的一層,是位于應用層和傳輸控制層之間的一組介面,
socket是應用層與TCP/IP協議通信的中間軟體抽象層,它是一組介面,在設計模式中,socket其實就是一個門面模式,它把復雜的TCP/IP協議隱藏在socket介面后面,對用戶來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議,
兩臺主機通信,必須通過socket連接,socket則利用TCP/IP協議建立TCP連接,TCP連接則更依靠于底層的IP協議,IP協議的連接則依賴于鏈路層等更低層次,
websocket則是一個典型的應用層協議,
六、通過IpIdea實作Socks5
1、ipidea簡介
全球領先的互聯網大資料IP資源
ipidea是一家海外爬蟲代理商,提供海外住宅ip和海外靜態ip,主要是做資料采集的業務,與多個資料采集企業保持長期的合作,它提供9000萬ip資源,可以根據抓取需求自定義設定ip輪換時間,從而避免被網站阻止訪問,支持賬密認證和API提取兩種方式提取ip資源,最重要的是支持免費測驗,

Socks5代理是Socks的增強版,使用代理服務器可以很好地隱藏匿名訪問任何在線資訊,
2、Socks5代理可以適用的業務場景
(1)ip封鎖
當您嘗試從試圖限制您的網站訪問資訊,ip很可能會被封鎖,使用socks 5代理可以幫助消除此類限制,使你能正常訪問網站,
(2)協議限制
當您嘗試使用不同的請求(例如HTTP、HTTPS等)總會有某種限制可能會造成障礙,socks 5代理可以輕松管理任何型別的流量、程式或協議,
(3)提高互聯網速度和連接
socks 5代理,由于使用UDP協議,它提供了高效和卓越的互聯網性能,其他協議支持TCP主要側重于根據設定的格式交換包,而UDP則側重于其他相關因素,UDP不專注于將資料包轉換為固定資料包,這使其成為socks 5為用戶提供更快和更可靠的互聯網連接的理想選擇,
(4)減少錯誤計數并提高性能
socks 5代理是一個不會錯誤路由或錯誤標記資料包的代理,
注意,實際上并不是所有代理商都支持socks5協議的,ipidea是支持socks5協議的代理商之一,
七、SuperWebSocket實作服務端
1、創建視窗程式,WindowsFormsWebsocketServer
2、添加程式包
工具 -->Nuget包管理 -->管理解決方案的Nuget程式包 -->搜索 SuperWebSocket ,選擇SuperWebSocketNETServer,點擊右側 安裝,等待安裝完成,安裝完成以后,專案會多出很多參考庫,如下

3、代碼實體
using SuperWebSocket;
using System;
using System.Windows.Forms;
namespace WindowsFormsWebsocketServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
websocketServer();
}
private void websocketServer()
{
Log("我是服務端");
WebSocketServer webSocketServer = new WebSocketServer();
webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected;
webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived;
webSocketServer.SessionClosed += WebSocketServer_SessionClosed;
if (!webSocketServer.Setup("127.0.0.1", 1234))
{
Log("設定服務監聽失敗!");
}
if (!webSocketServer.Start())
{
Log("啟動服務監聽失敗!");
}
Log("啟動服務監聽成功!");
//webSocketServer.Dispose();
}
private void WebSocketServer_NewSessionConnected(WebSocketSession session)
{
Log("歡迎客戶端: 加入");
//SendToAll(session, msg);
}
private void WebSocketServer_NewMessageReceived(WebSocketSession session, string value)
{
Log("服務端收到客戶端的資料 ==》"+value);
//SendToAll(session, value);
}
private void WebSocketServer_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{
Log("客戶端:關閉,原因:");
//SendToAll(session, msg);
}
/// <summary>
/// 廣播,同步推送訊息給所有的客戶端
/// </summary>
/// <param name="webSocketSession"></param>
/// <param name="msg"></param>
public static void SendToAll(WebSocketSession webSocketSession, string msg)
{
foreach (var item in webSocketSession.AppServer.GetAllSessions())
{
item.Send(msg);
}
}
private delegate void DoLog(string msg);
public void Log(string msg)
{
if (this.logReveal.InvokeRequired)
{
DoLog doLog = new DoLog(Log);
this.logReveal.Invoke(doLog, new object[] { msg });
}
else
{
if (this.logReveal.Items.Count > 20)
{
this.logReveal.Items.RemoveAt(0);
}
msg = DateTime.Now.ToLocalTime().ToString() + " " + msg;
this.logReveal.Items.Add(msg);
}
}
}
}
八、WebSocket4Net實作客戶端
1、創建視窗程式,WindowsFormsWebsocketClient
2、添加程式包
工具 -->Nuget包管理 -->管理解決方案的Nuget程式包 -->搜索 WebSocket4Net ,選擇WebSocket4Net,點擊右側 安裝,等待安裝完成,安裝完成以后,專案會多出很多參考庫,如下

3、代碼實體
using System;
using WebSocket4Net;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsWebsocketClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
websocketServerTest();
}
public static WebSocket webSocket4Net = null;
public void websocketServerTest()
{
FileUtil.getInstance().Log("我是客戶端");
webSocket4Net = new WebSocket("ws://127.0.0.1:1234");
webSocket4Net.Opened += WebSocket4Net_Opened;
webSocket4Net.Error += websocket_Error;
webSocket4Net.Closed += new EventHandler(websocket_Closed);
webSocket4Net.MessageReceived += WebSocket4Net_MessageReceived;
webSocket4Net.Open();
Thread thread = new Thread(ClientSendMsgToServer);
thread.IsBackground = true;
thread.Start();
//webSocket4Net.Dispose();
}
private void saveBtn_Click(object sender, EventArgs e)
{
websocketServerTest();
}
public void ClientSendMsgToServer()
{
int i = 1;
while (true)
{
webSocket4Net.Send("love girl" + i++);
Thread.Sleep(TimeSpan.FromSeconds(5));
}
}
private void WebSocket4Net_MessageReceived(object sender, MessageReceivedEventArgs e)
{
FileUtil.getInstance().Log("服務端回復的資料:" + e.Message);
}
private void WebSocket4Net_Opened(object sender, EventArgs e)
{
FileUtil.getInstance().Log("客戶端連接成功!發送資料中...");
webSocket4Net.Send("來自客戶端,準備發送資料!");
}
private void websocket_Error(object sender, EventArgs e)
{
FileUtil.getInstance().Log("WebSocket錯誤");
Thread.Sleep(5000);
if (webSocket4Net.State!= WebSocketState.Open&&webSocket4Net.State!=WebSocketState.Connecting)
{
websocketServerTest();
}
}
private void websocket_Closed(object sender, EventArgs e)
{
FileUtil.getInstance().Log("WebSocket已關閉");
Thread.Sleep(5000);
if (webSocket4Net.State != WebSocketState.Open && webSocket4Net.State != WebSocketState.Connecting)
{
websocketServerTest();
}
}
}
}
九、客戶端向服務端發送訊息
1、客戶端

2、服務端

十、哪吒社區萬粉計劃
- Vue.js框架與Web前端開發
- Python網路編程從入門到精通
- 億級流量Java高并發與網路編程實戰
- Spring Cloud Alibaba微服務實戰

🍅 Java學習路線總結,搬磚工逆襲Java架構師🍅

🍅 Java學習路線總結,搬磚工逆襲Java架構師🍅

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393919.html
標籤:java
