WebSocket协议
Websocket协议具有生命周期,在生命周期由Websocket协议进行支撑。例如,在Servlet技术中,底层协议仅仅定义了简单的请求/响应交互,此交互完全独立于下一次交互。事实上,在大部分情况下携带交互数据的底层网络连接将被完全弱化。一些技术必须请求/响应交互模型之上构建会话,这有助于开发人员创建比单一的隔离的交互生存时间更长的应用。
Websocket协议定义了客户端和服务器间长时间存活的专用的TCP连接的正因为如此,在定义更长时间的生命周期方面,它比传统的Web请求/响应更快一步。此外,WebSocket协议定义了WebSocket连接上往返传输的数据的各个块的格式。一旦连接已经建立,这些传输的元数据描述了其用途。WebSocket协议中包含两种主要类型的帧:控制帧和数据帧。控制帧是用于执行协议的一些内部功能逻辑的数据传输,它意味着发送者准备关闭连接。其他控制帧是Ping帧和Pong帧。Ping帧和Pong帧是用来服务于连接健康性检测的数据传输。如果WebSocke希望检查其他WebSocket对等节点的连接的健康性,它可以发送Ping帧。当WebSocket对等节点收到Ping帧后,必须响应Pong帧。通乒乓球游戏一样,连接的健康性可以在任何时候进行检测。
WebSocket协议定义的另一类帧是数据帧。数据帧定义了携带应用数据的WebSocket传输的种类。数据帧分为两种基本类型:文本型和二进制型,一种是用来携带文本消息,另一种用来携带二进制数据。
JAVA API中webSocket的生命周期
- 打开事件:此事件发生在端点上建立新连接时并且在任何其他事件发生之前。
- 消息事件:此事件接收WebSocket对话中另一端发送的消息。它可以发生在WebSocket端点接收了打开事件之后并且在接收关闭事件关闭连接之前的任意时刻。
- 错误事件:此事件在WebSocket连接或者端点发生错误时产生。
- 关闭事件:此事件表示WebSocket端点的连接目前正在部分地关闭,它可以由参与连接的任意一个端点发出。
下面用一个JAVADemo实现服务器端和客户端的WebSokcet传送
Server代码:
package Echo;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);//设置服务监听端口
System.out.println("等待客户端连接...");//打印提示信息
Socket clientSocket = serverSocket.accept();//等待客户端连接
Scanner scanner = new Scanner(clientSocket.getInputStream());//客户端输入流
scanner.useDelimiter("\n");//设置分隔符
PrintStream outPrintStream = new PrintStream(clientSocket.getOutputStream());//客户端输出流
boolean flag = true;//循环标记
while (flag) {
if(scanner.hasNext()) {//有数据接收
String string = scanner.next().trim();//接收数据内容
if("bye".equalsIgnoreCase(string)) {//结束标记
outPrintStream.println("Bye!");//回应信息
flag = false;//结束循环
}else {
outPrintStream.println("[ECHO]" + string);//Echo信息
}
}
}
scanner.close();//关闭输入流
outPrintStream.close();//关闭输出流
clientSocket.close();//关闭客户端
serverSocket.close();//关闭服务端
}
}
Client端代码:
package Echo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(new InputStreamReader(System.in));
public static String getString(String prompt) throws Exception{//键盘信息输入
System.out.print(prompt);
String string = KEYBOARD_INPUT.readLine();
return string;
}
public static void main(String[] args) throws Exception{
Socket clientSocket = new Socket("localhost", 8888);//定义服务端的连接信息
//现在的客户端需要有输入与输出的操作支持,所以依然要准备Scanner与PrintWriter
Scanner scanner = new Scanner(clientSocket.getInputStream());//接收服务端输入内容
scanner.useDelimiter("\n");
PrintStream outputPrintStream = new PrintStream(clientSocket.getOutputStream());//向服务端发送内容
boolean flag = true;//循环标记
while(flag) {//循环处理
String inputString = getString("请输入内容:").trim();//获取键盘输入数据
outputPrintStream.println(inputString);//加换行
if(scanner.hasNext()) {//服务器端有回应
System.out.println(scanner.next());//输出回应信息
}
if("bye".equalsIgnoreCase(inputString)) {//结束判断
flag = false;//修改循环标记
}
}
scanner.close();//关闭输入流
outputPrintStream.close();//关闭输出流
clientSocket.close();//关闭客户端
}
}