用JAVA实现sse客户端

废话少说,直接上代码。
sseClient

package com.hyd.sse.client;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 
 * @author hyd
 *
 */
public class SseClient {

	/**
	 * 获取SSE输入流。
	 * 
	 * @param urlPath
	 * @return
	 * @throws IOException
	 */
	public static InputStream getSseInputStream(String urlPath) throws IOException {
		URL url = new URL(urlPath);
		HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
		// 这儿根据自己的情况选择get或post
		urlConnection.setRequestMethod("GET");
		urlConnection.setDoOutput(true);
		urlConnection.setDoInput(true);
		urlConnection.setUseCaches(false);
		urlConnection.setRequestProperty("Connection", "Keep-Alive");
		urlConnection.setRequestProperty("Charset", "UTF-8");
		//读取过期时间(很重要,建议加上)
		urlConnection.setReadTimeout(60 * 1000);
		// text/plain模式
		urlConnection.setRequestProperty("Content-Type", "text/plain; charset=UTF-8");
		InputStream inputStream = urlConnection.getInputStream();
		InputStream is = new BufferedInputStream(inputStream);
		return is;
	}

	/**
	 * 读取数据。
	 * 
	 * @param is
	 * @param ansMsgHandler
	 * @throws IOException
	 */
	public static void readStream(InputStream is, AnsMsgHandler ansMsgHandler) throws IOException {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(is));
			String line = "";
			while ((line = reader.readLine()) != null) {
				// 处理数据接口
				ansMsgHandler.actMsg(is, line);
			}
			// 当服务器端主动关闭的时候,客户端无法获取到信号。现在还不清楚原因。所以无法执行的此处。
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
			throw new IOException("关闭数据流!");
		}
	}

	public static void main(String[] args) throws IOException {
		String urlPath = "";
		InputStream inputStream = getSseInputStream(urlPath);
		readStream(inputStream, new AnsMsgHandler() {

			public void actMsg(InputStream is, String line) {
				System.out.println(line);
			}
		});
	}

}

数据处理接口
AnsMsgHandler

package com.hyd.sse.client;

import java.io.InputStream;

public interface AnsMsgHandler {

	void actMsg(InputStream is, String line);

}

多线程模式下的客户端,请关注后续。

Server-Sent Events (SSE) 是一种实时的 Web 通信技术,它允许服务器向浏览器推送数据,而无需客户端主动发起请求。在 Java实现 SSE,通常涉及到以下几个步骤: 1. **服务器端处理**: - 创建一个 HTTP 操作(通常是 GET 请求)。 - 在响应头中设置 `Content-Type: text/event-stream` 和 `Cache-Control: no-cache`,告诉浏览器这是一个 SSE 流。 - 使用循环或流式处理机制,每次有新数据时发送一个事件(Event: ...)。 - 使用分隔符(如 `\n\n` 或 `\r\n\r\n`)来标记每个事件。 ```java import java.io.OutputStream; import jakarta.servlet.http.HttpServletResponse; public void handleSseRequest(HttpServletRequest request, HttpServletResponse response) { response.setHeader("Content-Type", "text/event-stream;charset=UTF-8"); response.setHeader("Cache-Control", "no-cache"); OutputStream outputStream = response.getOutputStream(); try { outputStream.write("event: data\n".getBytes()); // 开始事件 outputStream.write(("data: " + "New message from server").getBytes()); outputStream.write("\n\n".getBytes()); // 结束当前事件并换行 // 模拟持续推送,这里可以用线程或者定时器实现 while (true) { // 每隔一段时间更新数据并发送 Thread.sleep(2000); outputStream.write(("data: " + "Another update").getBytes()); outputStream.write("\n\n".getBytes()); } } finally { outputStream.close(); } } ``` 2. **客户端接收**: - JavaScript 中,可以使用 `EventSource` 对象来监听服务器的数据推送。 - 创建一个新的 `EventSource` 对象,并在 `onmessage` 事件中处理接收到的数据。 ```javascript var source = new EventSource('/sse'); source.onmessage = function(event) { var data = event.data; console.log('Received:', data); }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值