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.