后端代碼
const express = require('express')
const cors = require('cors');const app = express();
app.use(cors());
const port = 3000;app.listen(port, () => {console.log(`Server running at http://localhost:${port}/`);
});const msg = `
全國同胞們,
尊敬的各位國家元首、政府首腦和國際組織代表,
尊敬的各位來賓,
全體受閱將士們,
同志們、朋友們:
今天,我們隆重集會,紀念中國人民抗日戰爭暨世界反法西斯戰爭勝利80周年,共同銘記歷史、緬懷先烈、珍愛和平、開創未來。
我代表中共中央、全國人大、國務院、全國政協、中央軍委,向全國參加過抗日戰爭的老戰士、老同志、愛國人士和抗日將領,向為中國人民抗日戰爭勝利作出重大貢獻的海內外中華兒女,致以崇高敬意!向支援和幫助過中國人民抵抗侵略的外國政府和國際友人,表示衷心感謝!向參加今天大會的各國來賓,表示熱烈歡迎!
同志們、朋友們!
中國人民抗日戰爭是艱苦卓絕的偉大戰爭。在中國共產黨倡導建立的抗日民族統一戰線旗幟下,中國人民以錚錚鐵骨戰強敵、以血肉之軀筑長城,取得近代以來反抗外敵入侵的第一次完全勝利。
中國人民抗日戰爭是世界反法西斯戰爭的重要組成部分,中國人民以巨大的民族犧牲,為拯救人類文明、保衛世界和平作出了重大貢獻。
歷史警示我們,人類命運休戚與共,各個國家、各個民族只有平等相待、和睦相處、守望相助,才能維護共同安全,消弭戰爭根源,不讓歷史悲劇重演!
同志們、朋友們!
中華民族是不畏強暴、自立自強的偉大民族。當年,面對正義與邪惡、光明與黑暗、進步與反動的生死較量,中國人民同仇敵愾、奮起反抗,為國家生存而戰,為民族復興而戰,為人類正義而戰。今天,人類又面臨和平還是戰爭、對話還是對抗、共贏還是零和的抉擇。中國人民堅定站在歷史正確一邊、站在人類文明進步一邊,堅持走和平發展道路,與各國人民攜手構建人類命運共同體。
中國人民解放軍始終是黨和人民完全可以信賴的英雄部隊。全軍將士要忠實履行神圣職責,加快建設世界一流軍隊,堅決維護國家主權、統一、領土完整,為實現中華民族偉大復興提供戰略支撐,為世界和平與發展作出更大貢獻!
歷史承載過去,也啟迪未來。新時代新征程,全國各族人民要在中國共產黨堅強領導下,堅持馬克思列寧主義、毛澤東思想、鄧小平理論、“三個代表”重要思想、科學發展觀,全面貫徹新時代中國特色社會主義思想,堅定不移走中國特色社會主義道路,傳承和弘揚偉大抗戰精神,踔厲奮發、勇毅前行,為以中國式現代化全面推進強國建設、民族復興偉業而團結奮斗!
中華民族偉大復興勢不可擋!人類和平與發展的崇高事業必將勝利!
`;app.get('/events', (req, res) => {res.setHeader('Content-Type', 'text/event-stream');res.setHeader('Cache-Control', 'no-cache');res.setHeader('Connection', 'keep-alive');res.flushHeaders();let counter = 0;const interval = setInterval(() => {counter++;res.write(`data: ${msg[counter]}\n\n`);console.log('Sent event:', msg[counter], msg.length, counter);if(counter === msg.length) {clearInterval(interval);res.end();}}, 100);req.on('close', () => {clearInterval(interval);console.log('SSE connection closed');});
});
前端代碼
const [str, setStr] = useState('')const sseRef = useRef<EventSource | null>(null)const startSSE = () => {const evtSource = new EventSource("http://localhost:3000/events")sseRef.current = evtSourceevtSource.onopen = () => console.log("SSE 已連接")evtSource.onmessage = e => console.log("收到:", e.data)evtSource.onerror = err => {evtSource.close();console.log('error', err)};}useEffect(() => {return () => {console.log('close sse')evtSource.close()}}, [])return (<><Button onClick={startSSE}>開始SSE</Button><Button onClick={() => { sseRef.current?.close() }} >停止 SSE</Button>{str}</>)