Komunikator internetowy

0

Witam, piszę programik, który przesyła dane między serwerem a klientem


import java.net.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;

class server_komp implements Runnable 
          {
    private Socket s;
    private ObjectOutputStream output;
    private ObjectInputStream input;
    private String m="",m1="";
    private String mm[];

    public Baza ob_bazy;
    
    
    public server_komp(Socket s_,ObjectInputStream input_,
            ObjectOutputStream output_,Baza ob) {
        s=s_;
        input=input_;
        output=output_;
       
        ob_bazy=ob;        
        
       }
   
   
    public void run() {
             
        String pom;
              
        try {
                while(true) {
                m=(String) input.readObject();
             
                if (m.equals("czesc")) {
                
                    m1="czesc";
            
                    output.writeObject(  m1);
                    break;}
                
                     if (m.equals("add")) {
                     ob_bazy.wstaw_tytul();
                     }

                 if (m.equals("show")) {
                    m1=ob_bazy.wyswietl();
                    output.writeObject(  m1);
                    }
            }

            input.close();
            output.close();
            s.close();
            s=null;
           }catch (Exception e) {
            System.out.println("Wyjatek serwera1 "+e);}
    }
}

public class serwer2 implements Runnable {
    private int   sPort;
    public Baza ob_bazy;
    private ServerSocket serwer;
    private Socket s;
    private ObjectOutputStream output;
    private ObjectInputStream input;
    private String host;
    static int nr=0;
 
   
    public serwer2(int port_, String host_) {
        sPort = port_;
        host=host_;
     
        try {
            serwer = new ServerSocket(sPort);
        }catch(IOException e) {
            System.out.println(e);}
    }
    
    
    public void run() {

        System.out.println("Serwer startuje na hoscie "+host);
        while (true) {
            try {
                s = serwer.accept(); 
               }catch (IOException e) {
                System.out.println("Nie mozna polaczyc sie z klientem "+e);
                System.exit(1);}//przerwanie pracy serwera nie jest zalecane w praktyce
            if (s!=null) {
                try {
                    output = new ObjectOutputStream(s.getOutputStream());
                    output.flush();
                    input = new ObjectInputStream(s.getInputStream());
                    Thread t = new Thread(new server_komp(s, input, output, ob_bazy));
                    t.start();
                }catch (Exception e) {
                    System.out.println("Wyjatek serwera "+e);}
            }
        }
    }
    
    public static void main(String args[]) throws Exception {
        String host_ = InetAddress.getLocalHost().getHostName();
        int Port = 15000;
        serwer2 s2 = new serwer2(Port, host_);
        Thread t = new Thread(s2);
        t.start();
    }
    
}

no i mam taki problem, że odwołanie do ob_bazy

 if (m.equals("add")) {
                     ob_bazy.wstaw_tytul();
                     }

pokazuje błąd Null Pointer Exception, pomimo tego, że przecież ob_bazy istnieje:
public Baza ob_bazy;
Proszę o pomoc

0

a co będzie jak m=(String) input.readObject(); zwróci null?

Pisząc warunki pisz "tekst".equals(zmienna), bo masz pewność, ze metody equals nie wywołasz na null.

0

Hm. Dzięki, ale wydaje mi się, że nie tu leży problem, bo null pointer exception wyskakuje też przy wpisywaniu do obiektu, a nie tylko odwołaniu do jego wartości, a skoro obiekt istnieje...why?

0

A gdzie go inicjujesz?

0

inicjuje, czyli nadaje wartość? no chyba właśnie tu:

if (m.equals("add")) {
                     ob_bazy.wstaw_tytul();
                     }

wstaw.tytul() pobiera dane i wpisuje je na liste.

0

nie. inicjuję czyli:
a) używam operatora new;

ob_bazy = new Baza();

b) przypisuję wartość z parametru metody do zmiennej:

public void setOb_Baza(Baza baza){
   ob_baza= baza;
}

Ty wywołujesz metodę na obiekcie który jest nullem.

0

poza tym w paru miejscach az sie prosi zeby uzyc finally bo jaka masz gwarancje input i output zostanie zamkniety?

0

wygląda na to, że macie rację, txh

0

teraz jeszcze mam taki problem, ze nie powinienem wywolywac funkcji usun/dodaj/wyswietl rownoczesnie. Chcialem uzyc notify i weit, ale nie wiem jak, przydalo by sie cos, co usypia wszystkie watki oprocz aktualnego

import java.net.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;


class server_komp implements Runnable
          {
    private Socket s;
    private ObjectOutputStream output;
    private ObjectInputStream input;
    private String m="",m1="";
  //  private String temp1, temp2, temp3, temp4, temp5; // do przechowywania info o ksiazkach
   // private String pomoc[] = new String[6];
    public Baza ob_bazy;
       
    public server_komp(Socket s_,ObjectInputStream input_,
            ObjectOutputStream output_,Baza ob) {
      
        s=s_;
        input=input_;
        output=output_;
       
        ob_bazy=ob;     
      
       }

    
    public void run() {
             
        String pom;
        
        try {         
            while(true) {
                m=(String) input.readObject();

                if (m.equals("czesc")) {                
                    m1="czesc";            
                    output.writeObject(  m1);
                    break;}
                
                     if (m.contains("add ")) {  //Dodawanie
                       // temp1 =(String) input.readObject();  temp2 =(String) input.readObject(); temp3 =(String) input.readObject(); temp4 =(String) input.readObject(); temp5 =(String) input.readObject();
                        String pomoc[]=m.split(" ");
                        if (pomoc.length == 6){
                            ob_bazy.wstaw_tytul(pomoc[1], pomoc[2], pomoc[3], pomoc[4], pomoc[5]);
                        }
                     }
                    if (m.contains("del ")) {  //Odejmowanie
                        String pomoc[]=m.split(" ");
                        if (pomoc.length <= 6){
                            ob_bazy.usun_tytul(pomoc[1]);
                        }
                     }

                     if (m.contains("find ")) {  
                        String pomoc[]=m.split(" ");
                        if (pomoc.length <= 6){
                            m1=ob_bazy.wyszukaj_tytul(pomoc[1]);
                            output.writeObject(  m1);
                        }
                     }

                    if (m.equals("show")) {
                        m=(String) input.readObject();

                        m1=ob_bazy.wyswietl();
                        output.writeObject(  m1);
                    }
            }

            input.close();
            output.close();
            s.close();
            s=null;
           }catch (Exception e) {
            System.out.println("Wyjatek serwera1 "+e);}
    }
}

public class serwer2 implements Runnable {
    private int   sPort;
    public Baza ob_bazy = new Baza();
    private ServerSocket serwer;
    private Socket s;
    private ObjectOutputStream output;
    private ObjectInputStream input;
    private String host;
    static int nr=0;
 
   
    public serwer2(int port_, String host_) {
        sPort = port_;
        host=host_;
     
        try {
            serwer = new ServerSocket(sPort);
        }catch(IOException e) {
            System.out.println(e);}
    }
    
    
    public void run() {

        System.out.println("Serwer startuje na hoscie "+host);
        while (true) {
            try {
                s = serwer.accept(); 
               }catch (IOException e) {
                System.out.println("Nie mozna polaczyc sie z klientem "+e);
                System.exit(1);}//przerwanie pracy serwera nie jest zalecane w praktyce
            if (s!=null) {
                try {
                    output = new ObjectOutputStream(s.getOutputStream());
                    output.flush();
                    input = new ObjectInputStream(s.getInputStream());
                    Thread t = new Thread(new server_komp(s, input, output, ob_bazy));
                    t.start();
                }catch (Exception e) {
                    System.out.println("Wyjatek serwera "+e);}
            }
        }
    }
    
    public static void main(String args[]) throws Exception {
        String host_ = InetAddress.getLocalHost().getHostName();
        int Port = 15000;
        serwer2 s2 = new serwer2(Port, host_);
        Thread t = new Thread(s2);
        t.start();
    }
    
}
0

A fuj... Nie lepiej użyć Executor?
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executor.html

Każde zadanie będzie wykonywane w ramach swojego wątku przez wyspecjalizowaną klasę (na przykład http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html) co zapewni dobrą separację logiki związanej z wysyłaniem/odbieraniem wiadomości od logiki związanej z zarządzaniem kolejkowaniem zadań.

0

Tylko, że to jest zadanie na zaliczenie, a dostałem polecenie użycia notify i wait. Trochę nie wiem jak to ułożyć sensownie. Ale poczytam o tym executorze

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