Streaming de um Objeto

4 respostas
H

Pessoal, boa tarde.

Pode parecer uma pergunta boba, mas eu consigo fazer uma Streaming de um Objeto de uma Applet
para um Servlet:

A Applet eu achei na Net (acho que aki mesmo) é para tirar foto de uma webcam e mandar pro servidor. Funciona 100% com JMF com as adaptações que fiz :
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URL;
import java.net.URLConnection;

import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JButton;
import javax.swing.JComponent;


public class WebcamCaptureApplet extends Applet implements ActionListener {  

	public static Player player = null;  
	public CaptureDeviceInfo di = null;  
	public MediaLocator ml = null;
	public JButton iniciar = null;
	public JButton capture = null;  
	public JButton fechar  = null;
	public Buffer buf = null;  
	public Image img = null;  
	public VideoFormat vf = null;  
	public BufferToImage btoi = null;  
	public ImagePanel imgpanel = null;  
	public URL url;  
	public URLConnection conn;  
	public String hostname = "localhost"  ;
	public int port = 8080;  
	public Panel panel = null;


	public void init(){  
		setLayout(new BorderLayout());  
		setSize(320,320);  
		imgpanel = new ImagePanel();  
		
		capture = new JButton("Foto");  
		capture.setSize(60,40);
		capture.addActionListener(this);  
	
		//This may differ check the jmf registry for  
		// correct entry  

		String str2 = "vfw://:0";  
		ml = new MediaLocator(str2);
		//hostname = getCodeBase().getHost();  
		//port = getCodeBase().getPort();  

		try {  
			player = Manager.createRealizedPlayer(ml);
			player.start();  
			Component comp;  
			if ((comp = player.getVisualComponent()) != null) {  
				add(comp,BorderLayout.NORTH);  
			}
			panel = new Panel();
			panel.add(capture);
			add(panel,BorderLayout.CENTER);
			//add(imgpanel,BorderLayout.SOUTH);  
		} catch (Exception e) {  
			e.printStackTrace();  
		}  
	}  

	public void paint (Graphics g) {  

	}  

	public static void playerclose() {  
		player.close();  
		player.deallocate();  
	}  

	public void actionPerformed(ActionEvent e) {  
		JComponent c = (JComponent) e.getSource();  
		if (c == capture) {  
			// Grab a frame  
			FrameGrabbingControl fgc = (FrameGrabbingControl)  
			player.getControl("javax.media.control.FrameGrabbingControl");  
			buf = fgc.grabFrame();  
			btoi = new BufferToImage((VideoFormat)buf.getFormat());  
			img = btoi.createImage(buf);  
			String matric = "9999";
			Objeto obj = new Objeto();
			obj.setImagem(img);

			obj.setMatric(matric);
			UploadImage(obj);  
			player.close();  
			player.deallocate();
		}  
	}  



	public void start()  
	{  
	}  

	public void UploadImage(Objeto obj){  
		try {  
			String path = "http://"+hostname+":"+port+"/webcam/sampleServlet.do";  
			url = new URL(path);

			conn = url.openConnection();  

			//Prepare for both input and output  
			conn.setDoInput(true);  
			conn.setDoOutput(true);  

			//Turn off caching  
			conn.setUseCaches(false);  

			//Set the content type to be java-internal/classname  
			conn.setRequestProperty("Content-type", "application/x-java-serialized-object");  
			
			//Write the object as post data  
			ObjectOutputStream out = new ObjectOutputStream(conn.getOutputStream());
			
			out.writeObject(obj); //Dá erro aqui
			
			out.flush();  
			out.close();  
			InputStream ins = conn.getInputStream();  
			ObjectInputStream objin = new ObjectInputStream(ins);  
			String msg = (String)objin.readObject();  
			System.out.println(msg.toString());  

		} catch (Exception e) {  
			// TODO Auto-generated catch block  
			System.out.println(e);  
		}  

	}  

	class ImagePanel extends Panel {  
		public Image myimg = null;  
		public ImagePanel() {  
			setLayout(null);  
			setSize(120,140);  
		}  

		public void setImage(Image img) {  
			this.myimg = img;  
			repaint();  
		}  

		public void paint(Graphics g) {  
			if (myimg != null) {  
				g.drawImage(myimg, 0, 0, this);  
			}  
		}  

	}  
	
	public class Objeto implements Serializable{
				
		private String matric = null;
		private Image imagem = null;
		public Objeto() {
			super();
			// TODO Auto-generated constructor stub
		}
		public Objeto(String matric, Image imagem) {
			super();
			this.matric = matric;
			this.imagem = imagem;
		}
		public String getMatric() {
			return matric;
		}
		public void setMatric(String matric) {
			this.matric = matric;
		}
		public Image getImagem() {
			return imagem;
		}
		public void setImagem(Image imagem) {
			this.imagem = imagem;
		}
				
	}

}

A foto é tirada sem problemas e o o objeto é montado "bunito".
Só na hora de enviar que dá java.io.NotSerializableException: java.awt.image.BufferedImage em out.writeObject(obj);
eu coloquei um System.out.println na primeira linha do doPost() do servlet mas nem da erro, ou seja, não chega a enviar.
A conexão ele abre porque quando o tomcat está down ele dá um erro de conexão.

Alguém pode me dar uma luz?

4 Respostas

renzonuccitelli

O objeto que vc está mandando implementa a interface Serializable? Pelo erro, pode ser isso…

H

é sim… :frowning:
No final da Applet está declarado o objeto Objeto:

public class Objeto implements Serializable{
renzonuccitelli

String eu sei que é Serializable, mas Image o é? Porque um objeto para ser serializável deve possuir atributos que tb o sejam…

H

Cara… sua pergunta anterior me abriu a mente.

Como estou trabalhando com servlet, precisava do objeto “Objeto” dentro do meu servlet. nesse caso, criei Objeto.java, retirando-a da Applet e importando em ambos.

Advinha: FUNCIONOU (:cry: de alegria)

(Fui fazer um lançamento pro atacante e marquei um golaço)

De qualquer modo, obrigado pela ajuda!!

Ps. Como boto um “Resolvido” neste tópico?

Criado 5 de outubro de 2008
Ultima resposta 6 de out. de 2008
Respostas 4
Participantes 2