Połączenie apletu z serwerem. Sockety.

0

Witam.

Oto kod apletu (klienta)

import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.TextField;
import java.lang.*;


public class socket extends Applet implements ActionListener{
    
            Socket localSocket;  
	JButton przycisk;
	JLabel label;
	JTextField pole_tekstowe;
	
	
           public void init(){
	
		JFrame ramka = new JFrame();
		ramka.setLayout(null);
		
		label = new JLabel("kaka");
		label.setSize(200,50);
		label.setLocation(50,50);
		ramka.add(label);
		
		ramka.setSize(300,300);
		ramka.setVisible(true);
		
                      przycisk = new JButton("Kliknij mnie");
		przycisk.setLocation(50,100);
		przycisk.setSize(200,50);
		przycisk.addActionListener(this);	
		ramka.add(przycisk);
	
		
            }
            public void actionPerformed(ActionEvent e)
            {
                    try{
		     localSocket = new Socket(this.getCodeBase().getHost(), 5555);
        
		     InputStreamReader strCzytelnik = new InputStreamReader(localSocket.getInputStream());
		     BufferedReader czytelnik = new BufferedReader(strCzytelnik);
		
                            String tekst = czytelnik.readLine();
		
		     label.setText(tekst);
		
		     czytelnik.close();
        
                    }
		
	        catch(UnknownHostException unc)
                   {
                              label.setText("Connection why not connected");
                    }
	         catch(IOException ex)
                    {
                          label.setText("bu");
      	         }	  
          }
    
}

A to kod serwera:

import java.io.*;
import java.net.*;
public class MyServer {
	String[] listaPorad = {"baba", "saba", "DUZE", "male"};
	
	public void do_dziela(){
		try{
			ServerSocket gniazdoSrw = new ServerSocket(5555);
			
			while(true){
				Socket gniazdo = gniazdoSrw.accept();

				PrintWriter pisarz = new PrintWriter(gniazdo.getOutputStream());
				String porada = wybierzPorade();
				pisarz.println(porada);
				pisarz.close();
			}
		}
		catch(IOException ex){
			ex.printStackTrace();
		}
	}
	
	public static void main (String[] args){
		serwer popraw = new serwer();
		popraw.do_dziela();
	}
	
	private String wybierzPorade(){
		int random = (int) (Math.random()*listaPorad.length);
		
		return listaPorad[random];
	}
}

Klient i "serwer" znajdują się na tym samym serwerze w sieci. Po odpaleniu apletu i kliknięciu w przycisk nic się nie dzieje.
Chciałbym aby po kliknięci przycisku aplet połączył się z "serwerem" i pobrał wiadomość i wyświetlił w polu 'label'.

Pozdrawiam i z góry dziękuje za pomoc ;)

0

Może aplet powinien coś wysłać do serwera?

0

Testowałem ten kod w konsoli (bez ram apletu jako normalny program java) i wszysko działało.

Co aplet powinien wysyłać do serwera ? Wygląda że mam duże luki w wiedzy...

0

Nie musisz nic wysyłać do serwera ;). Musisz zrobić jedną z dwóch rzeczy:

  • podpisać aplet
  • w pliku java.policy dodać wierszpermission java.net.SocketPermission "localhost:5555", "connect,resolve";
0

Stworzyłem plik .jar i podpisałem go. Więc na serwerze mam pliki klienta .class i .jar, oraz plik serwera .class

Jednak po wciśnięciu przycisku, przez chwilę aplet się zawiesza, po czym daje wyjątek IO Exception.

Jakie mogą być przyczyny tych problemów?

Pozdrawiam :)

0
  1. Po co na serwerze jest plik klienta .class?
  2. Dodaj sensowną obsługę błędów i otwórz konsole Javy, to się dowiesz w czym problem.
  3. Ja też podpisałem jar, uruchomiłem program MyServer na serwerze, i wszystko jedno skąd pobieram aplet (tzn. wszystko jedno w jakim jest katalogu serwera), aplet łączy się z serwerem.
0

Wiem że to wyjątek IO z tego fragmentu kodu :

catch(IOException ex)
{
     label.setText("bu");
} 

Gdy wyłapie ten wyjątek, zmienia tekst w label na "bu" ;p

Ale chciałbym zwrócić uwagę na coś innego. Mianowicie napisałeś że uruchmiłeś program MyServer na serwerze. Ja owszem uruchamiałem MyServer, ale tylko jak testowałem w konsoli na swoim komputerze (bez ram apletu). Używałem do tego polecenia "java". Jak wygląda uruchamianie MyServer na serwerze. Tego nigdy nie robiłem.

0

Zależy jaki masz dostęp do serwera i co serwer oferuje. Ja wrzuciłem plik MyServer.class na serwer, połączyłem się programem putty, przeszedłem do właściwego katalogu i wpisałem java MyServer. (Dodatkowo, ponieważ w domu mam SDK 7, a na serwerze jest JRE 6, to musiałem odpowiednio kompilować javac -source 1.6 -target 1.6 MyServer.java).

0

Do tej pory testowałęm wszystko na darmowym cba.pl. Teraz dowiedziałęm się, że on nie udostępnia dostępu przez putty. Doczytałem że darmowe serwery w ogóle tego nie udostępniają.
Muszę poszukać innego wyjścia. (albo zainwestuje w jakiś serwer)

Zastanawia mnie jeszcze jedna sprawa. Ogólnie w swoim sposobie myślenia za wzór brałem gry z kurnika. Są aplety i na pewno musi być server. Jak to może tam wyglądać? Jest on raz uruchamiany jak opisywałeś i działa non stop (w końcu gry są dostępne 24/h) czy jak to może wyglądać?

Pozdrawiam.

0

Drążę ten temat dalej i zauważyłem że ciężko znaleźć polski hosting, który oferuje obłsugę javy.

Czy mógłby mi ktoś polecić dobry hosting z obsługą javy? (pomijając jhosting.pl gdzie ceny są nie na moją keiszeń)

Pozdrawiam :)

0

Ja korzystam z serwera uczelnianego, inne nie były mi dotychczas potrzebne.

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