Я пытаюсь передать поток M-JPEG из пользовательского объекта источника видео, но при просмотре соединения из wirehark данные не возвращаются с сервера. Ниже приведены некоторые соответствующие сегменты кода, которые я использовал. Кто-нибудь знает, как заставить этот код функционировать?Как вы можете передавать M-JPEG с Java HttpServer?
Сегмент:
try {
server = new HTTPServerWrapper(8099);
server.MJpegBindVideoSource(camera, "/test");
} catch (IOException ex) {
Logger.getLogger(Recorder.class.getName()).log(Level.SEVERE, null, ex);
}
физика/сервер/HTTPServerWrapper.java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package physics.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import physics.VideoSource;
/**
*
* @author rritoch
*/
public class HTTPServerWrapper {
com.sun.net.httpserver.HttpServer server;
public HTTPServerWrapper(int port) throws IOException{
server = com.sun.net.httpserver.HttpServer.create(new InetSocketAddress(port), 0);
}
public void MJpegBindVideoSource(VideoSource vs, String path) {
final VideoSource v = vs;
server.createContext(path,new MJpegHandler(vs));
}
}
физика/сервер/MJpegHandler.java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package physics.server;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import physics.VideoSource;
/**
*
* @author rritoch
*/
public class MJpegHandler implements HttpHandler {
VideoSource vs;
public MJpegHandler(VideoSource videosource) {
this.vs = videosource;
}
public void setVideoSource(VideoSource videosource) {
this.vs = videosource;
}
public void handle(HttpExchange connection) throws IOException {
byte[] data;
System.err.println("Connect...");
String boundary = "VNetPhysics";
Headers responseHeaders = connection.getResponseHeaders();
responseHeaders.add("Content-Type", String.format("multipart/x-mixed-replace; boundary=--%s", boundary));
responseHeaders.add("Cache-Control", "no-cache, private");
responseHeaders.add("Pragma", "no-cache");
responseHeaders.add("Max-Age", "0");
responseHeaders.add("Expires", "0");
connection.sendResponseHeaders(200, 0);
OutputStream responseBody = connection.getResponseBody();
while (true) {
BufferedImage bufferedImage = vs.getBufferedImage();
ByteArrayOutputStream os = new ByteArrayOutputStream(8192 * 4);
ImageIO.write(bufferedImage, "jpg", os);
data = os.toByteArray();
os.close();
responseBody.write(("--" + boundary + "\r\n"
+ "Content-type: image/jpg\r\n"
+ "Content-Length: "
+ data.length
+ "\r\n\r\n").getBytes());
responseBody.write(data);
responseBody.flush();
}
}
};
Edit: После добавления сообщения о подключении to stderr кажется, что запросы на http: // 192.168.2.7:8099/test не направляются на этот обработчик, без обработчик, я вижу, почему он не работает. Что мне не хватает, чтобы обработать этот обработчик?
Psssh ... "requestHeaders" не представляет заголовки ответов. Для остатка, почему именно вы используете бесконечный цикл 'while (true)? – BalusC
@BalusC, теперь это смущает ... но спасибо за улов. Бесконечный цикл является временным, пока я не смогу внедрить некоторый код для отслеживания состояния соединения. Я буду следить после проверки кода. –
@BalusC, у меня все еще такая же проблема. Я сузил проблему до того, что обработчик не вызван. Соединение устанавливается, поэтому я не знаю, почему обработчик не вызывается для запросов «GET/test HTTP/1.1» –