Witam,
Mam mały problem z moją aplikacją, tzn. chcę aby klient[j2me] zapisał tablice odebraną z serwera[j2se] a następnie wyświetlił ją jako ChoiceGroup na głównej formatce. Problem pojawia się przy wywołaniu metody odpowiedzialnej za dołączenie tablicy do ChoiceGroup, klient rozłącza się z serwerem i otrzymuje stosowny komunikat("serwer zakończył działanie") :(
klient:
package klient;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class KlientCzataMIDlet extends MIDlet implements CommandListener{
private WatekKlienta watek;
private Form formaPierwsza;
private Form formaGlowna;
private Display screen;
private Alert a;
private TextField poleHost;
private TextField poleLogin, poleHaslo;
private TextField poleTekst;
private TextField poleImie, poleNazwisko, poleDane;
private ChoiceGroup tabNazwisk;
private final String znak = "~";
public KlientCzataMIDlet(){
screen = Display.getDisplay(this);
formaPierwsza = new Form("Polacz z serwerem");
poleHost = new TextField("Wprowadz adres serwera: ","127.0.0.1",100,TextField.ANY);
poleLogin = new TextField("Wprowadz swoj login: ","",30,TextField.ANY);
poleHaslo = new TextField("Haslo: \r\n","",20,TextField.PASSWORD);
poleImie = new TextField("Imie: ","",30,TextField.ANY);
poleNazwisko = new TextField("Nazwisko: ","",50,TextField.ANY);
poleDane = new TextField("Dane: ","",20,TextField.ANY);
formaPierwsza.append(poleLogin);
formaPierwsza.append(poleHaslo);
formaPierwsza.append(poleHost);
Command polacz = new Command("Polacz",Command.OK,0);
formaPierwsza.addCommand(polacz);
Command koniec = new Command("koniec",Command.EXIT,0);
Command wyslij = new Command("wyslij",Command.OK,0);
formaGlowna = new Form("klient");
poleTekst = new TextField("","",100,TextField.UNEDITABLE);
formaGlowna.append(poleTekst);
formaGlowna.append(poleNazwisko);
tabNazwisk = new ChoiceGroup("Nazwisko",ChoiceGroup.POPUP);
formaGlowna.append(tabNazwisk);
formaGlowna.append(poleImie);
formaGlowna.append(poleDane);
formaGlowna.addCommand(wyslij);
formaGlowna.addCommand(koniec);
formaPierwsza.setCommandListener(this);
formaGlowna.setCommandListener(this);
//formaUzytkownika.setCommandListener(this);
screen.setCurrent(formaPierwsza);
}
public void commandAction(Command c, Displayable s){
if(s == formaPierwsza){
if(c.getCommandType() == Command.OK){
if(!poleHost.getString().equals("") && !poleLogin.getString().equals("") && !poleHaslo.getString().equals("")){
watek = new WatekKlienta(poleHost.getString(),poleLogin.getString(),poleHaslo.getString(),this);
watek.start();
poleTekst.setString("Wybierz klienta: ");
}else{
pokazKomunikat("Uzupelnij wszystkie pola!!!");
}
}
if(c.getCommandType() == Command.EXIT){
this.notifyDestroyed();
}
}
if(s == formaGlowna){
if(c.getCommandType() == Command.OK){
Thread send = new Thread(new Runnable(){
public void run(){
if(watek != null){
watek.wyslij("search"+znak);
poleTekst.setString("");
}
}
});
send.start();
}
if(c.getCommandType() == Command.EXIT){
destroyApp(true);
}
}
}
public void pokazKomunikat(String tekst){
a = new Alert(tekst);
a.setTimeout(3000);
screen.setCurrent(a);
}
public void zaloguj(boolean wartosc){
if(wartosc){
screen.setCurrent(formaGlowna);
}else{
this.pokazKomunikat("zly login/haslo!");
}
}
public void dodajTekst(String tekst){
poleTekst.setString(tekst+"\r\n");
}
<b> //PO WYWOŁANIU TEJ METODY PROGRAM PRZESTAJE DZIAŁAĆ
public void dodajNazwisko(String[] nazwisko){
// poleNazwisko.setString(nazwisko[1]);
for(int i=0;i<=nazwisko.length;i++){
this.tabNazwisk.append(nazwisko[i], null);
// System.out.println("To jest nazwisko z metody dodajNazwisko: "+nazwisko[i]);
}
}
</b>
public void startApp(){}
public void pauseApp(){}
public void destroyApp(boolean bezwarunkowy){
if(watek!=null){
watek.zatrzymajWatek();
}
}
}
watekKlienta:
package klient;
import javax.microedition.io.*;
import java.io.*;
public class WatekKlienta extends Thread{
private String login;
private String haslo;
private KlientCzataMIDlet klient;
private SocketConnection pol;
private InputStream in;
private PrintStream out;
private boolean czyOdbierac = true;
private String host;
private final int port = 34567;
private final String znak = "~";
public WatekKlienta(String host, String login, String haslo, KlientCzataMIDlet klient){
this.host = host;
this.login = login;
this.haslo = haslo;
this.klient = klient;
}
public void wyslij(String tekst){
out.println(tekst);
}
public String odbierz() throws IOException{
StringBuffer bufor = new StringBuffer();
int b = 0;
while((b!=-1) && (b!=10)){
b = in.read();
if(b!=-1){
bufor.append((char)b);
}
}
return this.przytnij(bufor.toString());
}
private String przytnij(String s){
String wynik =s;
int k = wynik.indexOf((char)10);
if(k!=-1){
wynik = wynik.substring(0,k-1);
k = wynik.indexOf((char)13);
if(k!=-1){
wynik = wynik.substring(0, k-1);
}
}
return wynik;
}
private String[] podziel(String s, String sep){
if(s.length()>0){
String[] wyniki = new String[ileZnakow(s,sep)+1];
int i = 0, poczatek = 0, koniec = s.indexOf(znak, 0);
while(i<wyniki.length){
if(koniec == -1){
koniec = s.length();
}
wyniki[i]=s.substring(poczatek,koniec);
poczatek = koniec+1;
koniec = s.indexOf(znak, poczatek);
i += 1;
}
return wyniki;
}else{
return new String[]{""};
}
}
private int ileZnakow(String s, String sep){
int liczba = 0;
for(int i=0;i<s.length();i++){
if(s.startsWith(sep, i)){
liczba += 1;
}
}
return liczba;
}
public void run(){
try{
pol = (SocketConnection)Connector.open("socket://"+host+":"+port);
out = new PrintStream(pol.openOutputStream());
in = pol.openInputStream();
wyslij("hello"+znak+login);
String komenda = "";
while(czyOdbierac){
komenda = odbierz();
String[] tablica = this.podziel(komenda, znak);
if(tablica[0].equals("zlylogin")){
klient.zaloguj(false);
break;
}
if(tablica[0].equals("loginok")){
klient.zaloguj(true);
wyslij("search"+znak);
}
if(tablica[0].equals("search")){
//System.out.println("To jest dlugosc tablicy: "+tablica.length);
klient.dodajNazwisko(tablica);
}
}
}catch(Exception e){
if(czyOdbierac){
klient.pokazKomunikat("Serwer zakonczyl dzialanie");
this.zatrzymajWatek();
try{
Thread.sleep(3000);
}catch(InterruptedException ie){}
}
klient.notifyDestroyed();
}
}
public void zatrzymajWatek(){
czyOdbierac = false;
try{
if(in != null){
in.close();
}
if(out != null){
out.close();
}
if(pol != null){
pol.close();
}
}catch(Exception e){}
}
}
serwer:
package serwer;
import java.io.*;
import java.net.*;
public class Watek extends Thread{
private Socket gniazdo;
private String login, haslo;
private MenadzerGniazdek m;
private BufferedReader in;
private PrintStream out;
private final String znak = "~";
public Watek(Socket gniazdo, MenadzerGniazdek m){
try{
this.gniazdo = gniazdo;
this.m = m;
in = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
out = new PrintStream(gniazdo.getOutputStream(), true);
}catch(Exception e){}
}
public Socket getGniazdo(){
return gniazdo;
}
public void wyslij(String tekst){
out.println(tekst);
}
public void setLogin(String login){
this.login = login;
}
public String getLogin(){
return login;
}
public void run(){
String s = "";
String[] tablica;
try{
while(true){
s = in.readLine();
tablica = s.split(znak);
if(tablica[0].equals("hello")){
if(m.sprawdzLogin(tablica[1])){
this.wyslij("loginok");
this.setLogin(tablica[1]);
}else{
this.wyslij("zlylogin");
}
}
<b>if(tablica[0].equals("search")){
//TUTAJ SA WYSYLANE DANE DO KLIENTA(na razie statycznie ale w przyszłości
//będą pobierane z bazy
m.wyslijWiadomosc("search"+znak+"Cobain"+znak+"Novoselic"+znak+"Grohl");
}</b>
}
}catch(Exception e){}
finally{
this.zatrzymaj();
}
}
public void zatrzymaj(){
try{
m.usunWatek(this);
gniazdo.shutdownInput();
in.close();
gniazdo.shutdownOutput();
out.close();
gniazdo.close();
}catch(Exception e){}
}
}
Z góry dziękuje za pomoc i pozdrawiam.