Applet no webserver nao funciona!

Ola pessoal,
criei um chat cliente/servidor. E o cliente fiz em applet, este applet roda normalmente diretamente do appletviewer e roda tambem se eu abrir pelo IE. Sendo que quando coloco ele no servidor (ja testei no tomcat e em outro servidor) da este erro:

java.lang.NoClassDefFoundError: ClienteApplet$1 at ClienteApplet.init(ClienteApplet.java:26) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
percebam q este erro eh diferente de quando o browser realmente nao acha o applet.
o arquivo.class esta no raiz do servidor e a tag do html esta correto:

<applet width="349" height="286" code="ClienteApplet.class"> </applet>
ja tentei compilar com a opçao target 1.1 tb.
Tenho o j2sdk 1.4.2_03
Nao sei mais o que fazer!!

Agradeço bastante quem me ajudar
Jose Jorge Jr.

ClienteApplet$1 eh uma classe anonima… vc enviou todos os .class da aplicacao para o servidor?

Rafael

sim.
o o unico arquivo da aplicaçao eh o ClienteApplet.class

o servidor tambem eh no meu proprio computador.
o html esta no mesmo diretorio do ClienteApplet.class

Jose Jorge Jr.

Pela mensagem de erro, voce esqueceu de enviar algum arquivo para o servidor.

Mesmo que voce soh tenha um arquivo .java, ao compilar eh gerado 1 ou mais arquivos .class, dependendo de como vc programou. No caso, voce tem alguma classe anomima, que ao compilar o javac cria automaticamente um outro .class somente para ela, mesmo nao havendo um arquivo .java correspodentente.
Verifique os arquivos gerados na hora que voce compila o applet. La devera ter a ClienteApplet$1.class tambem.

Rafael

Certo, no diretorio onde compile tambem gerou o ClienteApplet$1.class e coloquei o mesmo la no servidor… mas continua dando o mesmo erro!

Jose Jorge Jr.

ninguem pode me ajudar por favor?

Jose Jorge Jr.

Pode, o Rafael tá tentando … confere ai a localização dos arquivos.

Nunca trabalhei com applets, mas se não me falha a memória quando seu applet usa mais de uma classe é necessário setar a propriedade codebase na tag applet apontando pra um jar (um diretorio talvez tb funcione, nao sei).

Dê uma olhada na declaração da tag.

[EDITADO] Eis a declaração da tag, com os cumprimentos do W3C:

[code]<!–=================== Java APPLET tag ================================–>
<!–
This tag is supported by all Java enabled browsers. CODEBASE specifies
the base URL of the applet - the directory that contains the applet’s
code. If this attribute is missing the documents base URL is used
instead. One of CODE or OBJECT must be present. Archive files speed
loading of applets through a compressed wrapper for applet resources.
The ALT attribute gives text to display if the browser understands
the APPLET tag but can’t run Java applets. WIDTH, HEIGHT, ALIGN,
HSPACE and VSPACE are defined in the same way as for IMG elements.
–>
<!ELEMENT APPLET - - (PARAM | %text)*>
<!ATTLIST APPLET
codebase %URL #IMPLIED – optional base URL for applet –
archive CDATA #IMPLIED – comma separated archive list –
code CDATA #IMPLIED – applet class file –
object CDATA #IMPLIED – serialized applet file –
alt CDATA #IMPLIED – for display in place of applet –
name CDATA #IMPLIED – allows applets to find each other –
width %Pixels #REQUIRED – suggested width in pixels –
height %Pixels #REQUIRED – suggested height in pixels –
align %IAlign #IMPLIED – vertical or horizontal alignment –
hspace %Pixels #IMPLIED – suggested horizontal gutter –
vspace %Pixels #IMPLIED – suggested vertical gutter –
>

<!ELEMENT PARAM - O EMPTY>
<!ATTLIST PARAM
name NMTOKEN #REQUIRED – The name of the parameter –
value CDATA #IMPLIED – The value of the parameter –
>

<!–
Here is an example:

  &lt;applet codebase=&quot;applets/NervousText&quot;
  code=NervousText.class
  width=300
  height=50&gt;
  &lt;param name=text value=&quot;Java is Cool!&quot;&gt;
  &lt;img src=sorry.gif alt=&quot;This looks better with Java support&quot;&gt;
  &lt;/applet&gt;

–>[/code]

Entonces esquece o papo sobre o codebase, se os 2 arquivos estão no MESMO diretório deve funcionar.

codebase não é pra isso … mas vc pode tirar uma boa idéia desse link: http://www.agave.com/html/products/jddv08ac.htm

[/EDITADO]

segue abaixo o codigo-fonte completo do applet:

[code]
import java.net.;
import java.awt.
;
import java.awt.event.;
import java.io.
;
import javax.swing.*;

public class ClienteApplet extends JApplet {
private JTextField campo;
public JTextArea display;
private Socket cliente;
private String hostIP;
public String nome="cururu";
private ObjectOutputStream output;
private ObjectInputStream input;
public int id;

public void init&#40;&#41; &#123;
	//super&#40;&quot;clienteApplet&quot;&#41;;
	//nome = name;
	//hostIP = host;
	Container container = getContentPane&#40;&#41;;
		
	campo = new JTextField&#40;&#41;;
	campo.setEnabled&#40;false&#41;;
	container.add&#40;campo, BorderLayout.NORTH&#41;;
	campo.addActionListener&#40; 			
		new ActionListener&#40;&#41; &#123;				
			public void actionPerformed&#40;ActionEvent event&#41; 
			&#123;
				enviar&#40;event.getActionCommand&#40;&#41;&#41;;					
			&#125;
		&#125;
	&#41;;		
	
	display = new JTextArea&#40;&#41;;
	container.add&#40;new JScrollPane&#40;display&#41;, BorderLayout.CENTER&#41;;		
	setSize&#40;300,150&#41;;
	setVisible&#40;true&#41;;	
	runClient&#40;&#41;;
&#125;

private void conectar&#40;&#41; throws IOException &#123;
	display.setText&#40;&quot;Aguardando conexão...

");
cliente = new Socket("127.0.0.1", 5000);
display.append("Conectado a: "+cliente.getInetAddress().getHostName());
}

public void runClient&#40;&#41; &#123;
	try &#123;
		conectar&#40;&#41;;
		getStreams&#40;&#41;;
		processa&#40;&#41;;
	&#125;
	catch &#40;IOException e&#41; &#123;
		display.append&#40;&quot;

Erro no Cliente");
}
finally{}
}

private void getStreams&#40;&#41; throws IOException &#123;
	output = new ObjectOutputStream&#40;cliente.getOutputStream&#40;&#41;&#41;;		
	output.flush&#40;&#41;;
	
	input = new ObjectInputStream&#40;cliente.getInputStream&#40;&#41;&#41;;		
	display.append&#40;&quot;

Streams… OK");
campo.setEnabled(true);
}

private void processa&#40;&#41; throws IOException &#123;
	campo.setEnabled&#40;true&#41;;
	String mensagem;
	while &#40;true&#41; &#123;
		try &#123;					
			mensagem = &#40;String&#41;input.readObject&#40;&#41;; 
			display.append&#40;&quot;

"+mensagem);
}
catch (ClassNotFoundException e) {
display.append("
Erro ao ler mensagem do servidor.");
}
}
}

private void enviar&#40;String mensagem&#41; 
&#123;
	try &#123;						
		output.writeObject&#40;nome +&quot; &gt;&gt; &quot;+mensagem&#41;;
		output.flush&#40;&#41;;			
		display.append&#40;&quot;

"+nome +" >> "+mensagem);
campo.setText("");
}
catch (IOException e)
{
display.append("
Erro enviando mensagem.");
}
}

}[/code]

Qual o erro que da agora? se estiver dando o mesmo erro ainda ( de nao encontrar um .class ), eh pq o .class deve estar em algum diretorio errado no servidor, ou nem estar…

Rafael

Pessoal,
descobri que o erro eh nesse trecho do codigo:

		campo.addActionListener&#40; 			
			new ActionListener&#40;&#41; &#123;				
				public void actionPerformed&#40;ActionEvent event&#41; 
				&#123;
					enviar&#40;event.getActionCommand&#40;&#41;&#41;;					
				&#125;
			&#125;
		&#41;;

com esse trecho ele gera aquele arquivo ClienteApplet$1.class q eh justamente o q nao eh encontrado, mesmo ele estando no diretorio certo no servidor.
Parece logico para alguem? para mim nao

Jose Jorge Jr.

Essa eh a classe anonima sobre a qual estou falando desde o inicio…

Se quiser tentar de outra maneira, voce pode implementar usando uma classe concreta e mandar todos os .class pro ar, e ver se rola…

Rafael

Eh…
Mudei a forma de implementar o evento e funcionou blza.

Brigadao pela ajuda Rafael.
valeu mesmo.

Jose Jorge Jr.