区别:
Socket: Socket是位于java.net包下的一个类,
是 Java 提供的用于在客户端和服务器之间建立网络通信的底层套接字接口,用于传输层的网络通信。
WebSocket: WebSocket 是一种基于 TCP 协议的通信协议
,建立在 Socket 的基础上,提供了用于实时双向通信
的高级接口。
实现方法:
Socket: 使用 Socket 类可以创建 TCP/IP 连接并进行数据传输。客户端使用 Socket 和服务器建立连接,并通过输入流和输出流进行数据的发送和接收。
WebSocket: 使用 WebSocket 协议需要对服务器进行额外的配置。客户端与服务器通过 HTTP 协议进行握手,建立连接后,可以通过 WebSocket 的 API 进行实时的双向通信。
Socket 示例:
客户端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8080);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, Server!".getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[4096];
int bytesRead = inputStream.read(buffer);
String message = new String(buffer, 0, bytesRead);
System.out.println("Received message from client: " + message);
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
WebSocket 示例:
import javax.websocket.*;
import java.net.URI;
@ClientEndpoint
public class WebSocketClient {
@OnMessage
public void onMessage(String message) {
System.out.println("Received message from server: " + message);
}
public static void main(String[] args) {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
try {
Session session = container.connectToServer(WebSocketClient.class, new URI("ws://localhost:8080/websocket"));
session.getBasicRemote().sendText("Hello, Server!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@ServerEndpoint("/websocket")
public class WebSocketServer {
@OnMessage
public String onMessage(String message) {
System.out.println("Received message from client: " + message);
return "Server received your message: " + message;
}
}
上面注解是 Java WebSocket API(JSR 356)中提供的一些标准注解,用于在 Java 中创建 WebSocket 客户端和服务器端的端点。它们的具体含义如下:
@ClientEndpoint: @ClientEndpoint 是一个用于标注 WebSocket 客户端端点的注解。通过在一个类上使用 @ClientEndpoint 注解,将该类标记为 WebSocket 客户端的端点,表示该类将处理与服务器的连接和消息交互。可以在该类中定义处理消息的方法,如 @OnMessage。
@OnMessage: @OnMessage 是一个用于标注 WebSocket 终端的注解,指示一个方法将用于处理接收到的 WebSocket 消息。当收到消息时,WebSocket 运行时将调用带有 @OnMessage 注解的方法,并将接收到的消息作为参数传递给该方法。该方法可以根据需要进行消息的处理和响应。
@ServerEndpoint(“/websocket”): @ServerEndpoint 是一个用于标注 WebSocket 服务器端终端的注解。通过在一个类上使用 @ServerEndpoint 注解,并指定一个 URI 路径参数,将该类标记为 WebSocket 服务器端的端点。当客户端连接到指定的 URI 时,WebSocket 运行时将创建一个新的该类的实例,并将其用作与客户端的通信终端。类中可以定义多个方法,并使用 @OnMessage 注解进行消息的处理。