fix: 修复 MjpegServer.kt 文件丢失
- 确保所有源代码文件完整
This commit is contained in:
@@ -60,7 +60,7 @@ class MjpegServer(private val port: Int) {
|
|||||||
val iterator = clients.iterator()
|
val iterator = clients.iterator()
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val handler = iterator.next()
|
val handler = iterator.next()
|
||||||
if (handler.isSocketActive()) {
|
if (handler.isAlive()) {
|
||||||
handler.sendFrame(frame)
|
handler.sendFrame(frame)
|
||||||
} else {
|
} else {
|
||||||
iterator.remove()
|
iterator.remove()
|
||||||
@@ -80,6 +80,7 @@ class MjpegServer(private val port: Int) {
|
|||||||
clients.forEach { it.close() }
|
clients.forEach { it.close() }
|
||||||
clients.clear()
|
clients.clear()
|
||||||
serverSocket = null
|
serverSocket = null
|
||||||
|
serverThread = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ClientHandler(private val socket: Socket) : Thread() {
|
private class ClientHandler(private val socket: Socket) : Thread() {
|
||||||
@@ -93,17 +94,17 @@ class MjpegServer(private val port: Int) {
|
|||||||
clientStream = os
|
clientStream = os
|
||||||
socket.setSoTimeout(5000)
|
socket.setSoTimeout(5000)
|
||||||
|
|
||||||
// 读取HTTP请求 (清空缓冲区)
|
// 读取HTTP请求
|
||||||
val buffer = ByteArray(1024)
|
val buffer = ByteArray(1024)
|
||||||
socket.getInputStream().read(buffer)
|
socket.getInputStream().read(buffer)
|
||||||
|
|
||||||
// 发送MJPEG流头 - 正确的HTTP格式
|
// 发送HTTP响应头
|
||||||
val header = byteArrayOf(
|
val header = byteArrayOf(
|
||||||
*("HTTP/1.1 200 OK\r\n").toByteArray(),
|
*("HTTP/1.1 200 OK\r\n").toByteArray(),
|
||||||
*("Content-Type: multipart/x-mixed-replace; boundary=boundary\r\n").toByteArray(),
|
*("Content-Type: multipart/x-mixed-replace; boundary=boundary\r\n").toByteArray(),
|
||||||
*("Cache-Control: no-cache\r\n").toByteArray(),
|
*("Cache-Control: no-cache\r\n").toByteArray(),
|
||||||
*("Connection: close\r\n").toByteArray(),
|
*("Connection: close\r\n").toByteArray(),
|
||||||
*("\r\n").toByteArray() // 空行表示header结束
|
*("\r\n").toByteArray()
|
||||||
)
|
)
|
||||||
|
|
||||||
os.write(header)
|
os.write(header)
|
||||||
@@ -115,10 +116,10 @@ class MjpegServer(private val port: Int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun sendFrame(frame: ByteArray) {
|
fun sendFrame(frame: ByteArray) {
|
||||||
if (!initialized || clientStream == null) return
|
if (!initialized) return
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// MJPEG frame header with \r\n
|
// MJPEG frame header
|
||||||
val header = byteArrayOf(
|
val header = byteArrayOf(
|
||||||
*("--boundary\r\n").toByteArray(),
|
*("--boundary\r\n").toByteArray(),
|
||||||
*("Content-Type: image/jpeg\r\n").toByteArray(),
|
*("Content-Type: image/jpeg\r\n").toByteArray(),
|
||||||
@@ -128,7 +129,7 @@ class MjpegServer(private val port: Int) {
|
|||||||
|
|
||||||
clientStream?.write(header)
|
clientStream?.write(header)
|
||||||
clientStream?.write(frame)
|
clientStream?.write(frame)
|
||||||
clientStream?.write(("\r\n").toByteArray())
|
clientStream?.write("\r\n".toByteArray())
|
||||||
clientStream?.flush()
|
clientStream?.flush()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
close()
|
close()
|
||||||
@@ -143,7 +144,7 @@ class MjpegServer(private val port: Int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isSocketActive(): Boolean {
|
fun isAlive(): Boolean {
|
||||||
return !socket.isClosed && socket.isConnected
|
return !socket.isClosed && socket.isConnected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user