Aplet na www

0

problem jest nastepujacy, stworzylem aplet, wyeksportowalem klasy do pliku jar, stworzylem plik html

<html> <body> <applet width="640" height="480" code="Galeria.class" archive="Aplet.jar"> </body> </applet> </html>

wszystko umieszczone w jednym folderze, aplet dziala bez problemu w przegladarce uruchamiany z dysku. wrzucilem takze aplet tu:
http://freakman.fm.interia.pl/szachy/index.html

wraz ze wszystkimi potrzebnymi plikami (chociaz chyba tylko Aplet.jar i Galeria.class potrzebny?) i niestety juz z serwera nie moge uruchomic. W operze wyswietla sie napis Aplet loaded ale niestety nic dalej.

0

java.lang.ClassFormatError: Incompatible magic value 171712836 in class file Wyliczenia
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at Galeria.init(Galeria.java:82)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Rozwiązanie:
http://forum.java.sun.com/thread.jspa?threadID=646555&messageID=3807705

po ludzku wszytkie pliki .class na serwer marsz :)

0

dziekuje Panowie, dzieki forum jakos ciagne ten projekt. Siadlem do osblugi sieci, chce aby aplet (inteligentne - one wszystko licza) wysylaly do serwera po swoim ruchu tablice dwuwymiarowa ktora serwer przesle do apletu drugiego. Wiem, ze musze to zrobic na watkach, lecz juz czy to ma byc jeden socket czy 2, jak przeslac tablice (wszedzie przyklady odnosnie tekstu, czy mam to zrobic po kolei wartosciami tak jak sie wypelnia normalna tablice?) i jak w ogóle implementowac te watki to juz nie bardzo :/

0

O wątkach pisałem. Poszukaj w dziale poświęconym Javie.
Wysłanie tablicy. W sumie proste trzeba tylko pamiętać by obiekt który wysyłasz implementował interfejs Seralizable.
Prosty klient - serwer jest w dziale o Javie.

0

artykul przeczytalem. wyjasnil mi pare spraw.

s.accept();
s.accept();
new Watek1(s);
new Watek2(s);

jednak...chce aby po polaczeniu 2 apletow nadal im jakies id, pozwalal raz dzialac jednemu i dopiero gdy graczy wykona ruch przeslal tablice i pozwolil wykonac ruch drugiemu graczowi....nie mam pojecia jak to zaimplementowac:/ co umiescic w klasach Watek1 Watek2

0

Hm... razem z opisem ruchu do apletu wysyłasz zmienną boolean np. canMove i jeżeli jest true to gracz może się ruszyć jeżeli nie to nie :)

Na serwerze rejestrujesz sesję do której podpięte są dwa połączenia. zadaniem serwera jest dogadanie tych dwóch połączeń :)

0

tak tylko czy to musi byc zrobione na watkach czy nie- u mnie 2 aplety nie maja dawac mozliwosci ruszania pionkami jednoczesnie. a poza tym czy osobne sockety dla apletow czy jeden socket :/

0

Jestem już w domu więc się rozpiszę :)

Twoja aplikacja składa się w sumie z dwóch programów.

Pierwszy to serwer do którego zadań należą:

  • Zapewnienie komunikacji pomiędzy aplikacjami klienckimi
  • Dostarczenie części konfiguracji do aplikacji klienckich.

Drugim programem jest klient. Jego zadaniem jest:

  • Dostarczenie interfejsu użytkownika
  • Obsługa logiki "biznesowej" aplikacji, czyli gry w szachy
  • Obsługa komunikacji z serwerem.

Jeżeli chcesz, aby wszystko działało dobrze to zacznij od przygotowania protokołu komunikacyjnego najwyższej warstwy. Będzie on zapewniał wspólny język na poziomie "biznesowym" aplikacji. Mówiąc prościej opracuj to w jakim formacie będziesz przesyłał dane o np. ruchu. Moja propozycja:

import java.io.Serializable;
public class Komunikat implements Serializable{
	private static final long serialVersionUID = -3979320124811867075L;
	public final String[] RUCH;
        public final long id;
	public Komunikat(String[] ruch, long id) throws Exception{
		if (ruch.length != 2) 
			throw new Exception("Zły argument!!!");
		this.RUCH = ruch;
                this.id = id;
	}
}

Jak widać klasa Komunikat zawiera jedno pole RUCH, które definiuje początkową i końcową pozycję oraz identyfikator klienta. Posłuży nam do przekazywania najprostszych informacji. To będzie jedyna rzecz którą robi. Reszta to ozdobniki pozwalające na identyfikację.

Teraz popatrzmy jak to ma działać:
Wysyłanie komunikatu:
Użytkownik wykonuje ruch -> aplet sprawdza jego poprawność ->
jeżeli ruch jest nieprawidłowy to pokazuje się odpowiedni komunikat -> koniec;
jeżeli ruch jest prawidłowy -> stworzony zostanie obiekt Komunikat w którym zapisane są informacje o tym ruchu -> Obiekt zostaje przekazany do modułu wysyłającego go na serwer -> Komunikat zostaje wysłany -> czekamy na komunikat zwrotny ->
jeżeli doszedł zmieniamy flagę canMove na false, gracz czeka na ruch przeciwnika -> koniec;
jeżeli flaga zwrotna nie doszła -> komunikat o błędzie -> koniec;

Otrzymywanie komunikatu:
Osobny wątek nasłuchuje na określonym porcie -> pojawia sie komunikat -> zostaje wykonany ruch -> zmieniamy flagę canMove na true -> wysyłamy komunikat zwrotny -> czekamy na wykonanie ruchu przez użytkownika.

Po co serwer?
Serwer dogaduje dwa programy klienckie. Jak działa:
Serwer oczekuje i nasłuchuje na ogólnym porcie -> pojawia się nowy klient -> zostaje mu nadany identyfikator -> zostaje utworzony wątek o nazwie takiej jak identyfikator klienta, od tego momentu klient jest traktowany indywidualnie -> dopisujemy go, wątek, do kolejki wolnych graczy
Pojawia się drugi klient -> sprawdzamy czy są wolni gracze ->
jeżeli nie ma to postępujemy jak wyżej;
jeżeli są -> wybieramy gracza z kolejki wolnych graczy jeden z wątków -> rejestrujemy w nim drugiego gracza -> wysyłamy powiadomienia do obu o rozpoczęciu gry;

Gra na serwerze:
Serwer odbiera komunikat -> sprawdza id -> odsyła do konkretnego wątku -> wątek przesyła komunikat dalej za pomocą odpowiednich obiektów.

Proste :) dzięki identyfikacji użytkowników wszytko może działać na jednym porcie na serwerze i jednym, porcie na kliencie :)

0

ok mam sobie klase

import java.io.Serializable;

public class Figury implements Serializable {
int[][] figury;
public Figury(int[][] figury){
this.figury=figury;
}
}

wysylam ja w aplecie do serwera dzieki:
Figury figur=new Figury(figury);
output.writeObject(figur);

i chce odczytac, tylko jak to zrzutowac prawidłowo zebym w drugim aplecie otrzymal tablice int[][]. Cannot convert from Object to int :)
</ort></quote>

0

rzutuj na obiekt Figury! przeciez jego wlasnie wysylasz.
i dopisz sobie gettera oraz ID klasy

pozdrawiam

0

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

powoduje blad socket write error, wczesniej mam
String host = this.getDocumentBase().getHost();//pobranie IP hosta
socket = new Socket(host, 5433);

:/
niedlugo wyplyna mi oczy a w srode deadline. zostala tylko ta siec :/

0

wiem jak to ma wygladac mam juz sporo kodu, ale wlasnie ten blad wyskakuje czasami...czasem aplety sie lacza do socketow czasem nie :/

0

ok wiem ze zle czyta sie czyjsc kod..ale nie ogarniam juz tego :/

Serwer

public class Serwer {
	private Socket incoming,incoming2;

	private int kolejka = 1;
	boolean czyjRuch=false;
	int y=0,x=0;
	int[][] figury;
	
	Figury figur=new Figury(figury);
	public static void main(String[] args) {

		try {
			Serwer serwer = new Serwer();
			int i=1;
			ServerSocket s = new ServerSocket(1515);//otworzenie poru do polaczen
				Socket incoming = s.accept();//nasluchiwanie na polaczenie
				Socket incoming2 = s.accept();
				System.out.println("2gi polaczony");
				Runnable r = serwer.new ObslugaKlienta(incoming,incoming2);//uruchominie komunikacji z uzytkownikai
				Thread t = new Thread(r);
				t.start();
				i++;
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private class ObslugaKlienta implements Runnable {
		public ObslugaKlienta(Socket i,Socket i2) {
			incoming = i;
			incoming2=i2;
		}

		public void run() {

			try {
				try {
					
					System.out.println("dziala to czy nie");
					
					ObjectInputStream input = new ObjectInputStream(incoming.getInputStream());
					ObjectInputStream input2 = new ObjectInputStream(incoming2.getInputStream());
					ObjectOutputStream output = new ObjectOutputStream(incoming.getOutputStream());
					ObjectOutputStream output2 = new ObjectOutputStream(incoming2.getOutputStream());
					
					output.write(1);
					System.out.println("wyslano 1szy?");
					output2.write(2);
					System.out.println("kolejka"+kolejka);
					while (true) {
						if(kolejka==1){
						System.out.println("test serwer 1");
						try{
							figur=(Figury) input.readObject();
							kolejka=input.read();
							czyjRuch=input.readBoolean();
						}catch(ClassNotFoundException e){
							e.printStackTrace();
						}
						
						output2.writeObject(figur);
						output2.write(kolejka);
						output2.writeBoolean(czyjRuch);
						
						}
						
						if(kolejka==2){
							System.out.println("test serwer 2");
						
							kolejka=input2.read();
							output.writeObject(figury);
							output.write(kolejka);
							
							}
						System.out.println("x "+x+" y"+y+"kolejka"+kolejka);
					}
				}finally{
					
				}
				 
			} catch (Exception e) {
				e.printStackTrace();
			}
			try{
				incoming.close();
				incoming2.close();
			}catch(IOException e){
				
			}

		}
	}
}

oraz czesc apletu ktory ma sie z tym wszystkim laczyc

public void init(){
		
		
		Wyliczenia w=new Wyliczenia();
	//	Komunikat k=new Komunikat(figury, 1);
		this.resize(500,500);
		this.getContentPane().setLayout(null);
		panel.setVisible(true);
		addMouseListener(this);
		w.ustawFigury(figury);
		inicjujSzachy();
		repaint();
		String host = this.getDocumentBase().getHost();//pobranie IP hosta
		try {//nawiazanie polaczenia z serwerem
			socket = new Socket(host, 1515);
			inStream = new ObjectInputStream(socket.getInputStream());
			
			outStream =new ObjectOutputStream(socket.getOutputStream());
			System.out.println("Jestem tu?");
			graczId = inStream.read();
			System.out.println("graczID"+graczId);
			System.out.println("a tu?");
			System.out.println("graczid: "+graczId);

		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("watek tworze");
		Thread t1 = new Thread(new Odswiezanie());//uruchomienie watku do komunikacji z serwerem
		System.out.println("watek uruchamiam//");
		t1.start();
		
		
		
	}

class Odswiezanie implements Runnable {
			public void run() {
				System.out.println("watek odswiezanie dziala");
				System.out.println("graczID "+graczId);
				System.out.println("kolejka "+kolejka);
			for (;;) {
				if(kolejka==graczId)	{
					Wyliczenia w=new Wyliczenia();
					iloscKlik++;
					
					if(iloscKlik==1){
						xtmp=x;
						ytmp=y;
					}
					w.obslugaKlik2(iloscKlik, ytmp, xtmp, y, x, figury, figura, czyjRuch, tmp);
					
					if(w.sprawdzCzyBylRuch(figury, figuryTmp)==true) {
					tmp =w.koniecGry(figury, czyjRuch, czyKoniecGry)+tmp;
					koniecGry(tmp,czyjRuch);
					czyjRuch=!czyjRuch;
					repaint();
					try{
						ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
						Figury figur=new Figury(figury);
					
						output.writeObject(figur);
						kolejka = (kolejka % 2) + 1;
						
						output.write(kolejka);
						output.writeBoolean(czyjRuch);
						
					}catch(IOException e){
						e.printStackTrace();
					}
					}
					
					
					
					if(iloscKlik>1) iloscKlik=0;
					
					
					
				}
						
					
					if (graczId != kolejka) {
						//odczyt wspolrzednych z serwera
					
						try{
							ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
							
							Figury figur=new Figury(figury);
							try{
								figur=(Figury) input.readObject();
								kolejka = input.read();
								czyjRuch=input.readBoolean();
							}catch(ClassNotFoundException e){
								e.printStackTrace();
								
							}
							repaint();
						}catch(IOException e){
							e.printStackTrace();
						}
					}
				}
			}
		}

Formatowanie jest 'dosyc' robocze przepraszam, chodzi chyba glownie o to ze nie laduje graczId w init() i chyba wszytko staje w tym momencie :/ ale czemu nie laduje to juz nie mam pojecia

EDIT:

w klasie serwera w watku dochodzi do lini System.out.println("dziala to czy nie");, przy tworzeniu obiektow ObjectInputStream itp zatrzymuje sie..wcisnalem tam printline'y i nie chodza. ma ktos pojecie o co tu chodzi?

0

o mega!
jak myslisz - co sie dzieje po wywolaniu metody start() watku?
hehe
pomysl jeszcze chwilke....

nie podgladaj :P

no noobra - nie dajesz ani joina, ani nie nasluchujesz w petli, wiec IMO program po prostu konczy dzialanie. nie jestem pewien, czy o to chodzi ale to na pierwszy rzut oka, poza tym po write dawaj flush

daj znac czy pomoglo :P

pozdrawiam

0

z tego co ja rozumiem to dziala w ten sposob. podlacza sie pierwszy aplet przechodzi pierwszego s.accept() podlacza sie drugi przechodzi drugiego s.accept(), uruchamiany jest watek, powinien stworzyc obiekty

ObjectInputStream input = new ObjectInputStream(incoming.getInputStream());

wyslac graczId(1,2) po czym wchodzi do niekonczacej sie petli. ID ma byc nadawane tylko raz, tym czasem program nie chce przejsc tej wlasnie powyższej lini.....tak samo po stronie apletu program nie chce przejsc lini tworzacej obiekt typu ObjectInputStream. W sumie graczId moglbym przeslac obiektem typu OutputStream, ale ObjectOutputStreamPOtrzebny mi do wyslania obiektu, oraz ma metode writeBoolean.

EDIT
: a jesli chodzi o join to nie bardzo rozumiem

0

t1.start();
t1.join();

pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1