1. WebSocket是什么
WebSocket 是一種與 HTTP 不同的協(xié)議称近。兩者都位于 OSI 模型的應用層夹界,并且都依賴于傳輸層的 TCP 協(xié)議冀惭。 雖然它們不同染坯,但 RFC 6455 規(guī)定:WebSocket設(shè)計為通過 80 和 443 端口工作碌上,以及支持HTTP代理和中介倚评,從而使其與HTTP協(xié)議兼容。為了實現(xiàn)兼容性馏予, WebSocket 握手使用 HTTP Upgrade 頭從 HTTP 協(xié)議更改為 WebSocket 協(xié)議天梧。
與HTTP不同,WebSocket 提供全雙工通信霞丧。此外呢岗,WebSocket 還可以在 TCP 之上啟用消息流。 TCP 單獨處理字節(jié)流,沒有固有的消息概念后豫。
2. WebSocket悉尾、HTTP長連接區(qū)別
HTTP長連接的本質(zhì)還是HTTP協(xié)議,工作模式依舊是一問一答挫酿。即:客戶端發(fā)起一次請求构眯,服務(wù)器回應最多一次響應。這個本質(zhì)并沒有得到改變早龟,改變的只是在同一個TCP連接上可以進行多次請求和多次響應惫霸。Websocket不一樣,客戶端可以只請求一次服務(wù)器葱弟,然后服務(wù)器返回多次響應壹店。即:當連接建立之后,服務(wù)器可以主動給客戶端發(fā)送信息芝加,這點是HTTP做不到的硅卢。
3. WebSocket實踐(Java)
3.1 服務(wù)端
使用IDEA創(chuàng)建maven工程WebSocket_S
引入websocket依賴
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.6</version>
</dependency>
編寫SocketServer.Java
package com.devpotato;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import java.net.InetSocketAddress;
public class SocketServer extends WebSocketServer {
public SocketServer(int port) {
super(new InetSocketAddress(port));
}
public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
System.out.println("收到新的WebSocket連接請求: " + webSocket.getRemoteSocketAddress().getAddress().getHostAddress());
// 給新的WebSocket Client發(fā)送一條消息
webSocket.send("Welcome to the server!");
// 給所有的Client發(fā)送一條消息
broadcast("new connection: " + clientHandshake.getResourceDescriptor());
}
public void onClose(WebSocket webSocket, int i, String s, boolean b) {
System.out.println("--- onClose" + webSocket + s);
broadcast(webSocket + " onClose!");
}
public void onMessage(WebSocket webSocket, String s) {
System.out.println("--- onMessage: " + webSocket + ": " + s);
broadcast(s);
}
public void onError(WebSocket webSocket, Exception e) {
System.out.println("--- onError: " + webSocket + ": " + e.getMessage());
}
public void onStart() {
System.out.println("Server started!");
}
}
編寫App.Java
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
SocketServer socketServer = new SocketServer(8080);
socketServer.start();
}
}
3.2 客戶端
使用IDEA創(chuàng)建maven工程WebSocket_C
引入websocket依賴
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.6</version>
</dependency>
編寫App.Java
package com.devpotato;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
public class App {
public static void main(String[] args) throws Exception {
System.out.println("Hello World!");
WebSocketClient webSocketClient = new WebSocketClient(new URI("ws://127.0.0.1:8080")) {
public void onOpen(ServerHandshake serverHandshake) {
System.out.println("--- onOpen ---");
}
public void onMessage(String s) {
System.out.println("--- onMessage: " + s);
}
public void onClose(int i, String s, boolean b) {
System.out.println("--- onClose: " + s);
}
public void onError(Exception e) {
System.out.println("--- onError: " + e.getMessage());
}
};
webSocketClient.connect();
// 往websocket服務(wù)端發(fā)送數(shù)據(jù)
webSocketClient.send("Hello, this is client!");
}
}
4、啟動服務(wù)
啟動服務(wù)端
Server started!
啟動客戶端
Server started!
收到新的WebSocket連接請求: 127.0.0.1
--- onOpen ---
--- onMessage: Welcome to the server!
--- onMessage: new connection: /