Avatar billede oleoldhoj Nybegynder
09. september 2005 - 17:49 Der er 25 kommentarer

brug af ekstern variable i java

jeg sidder og roder med en simple opgave i java

jeg sidder med 3 filer ... KKMultiServer.java som gernere flere KKMultiServerThread(tråde) som alle bruger en KnockKnockProtocol

i KKMultiServeren laver jeg et en liste med varible
        public List nameList = new List();
som jeg ønsker at tilføre nogle værdier i protokollen (ok not nice men det kommer til at virke)

dvs noget nameList.add(nytNavn);
-----------------------------------------------------------------

import java.net.*;
import java.io.*;

public class KKMultiServer {

        public List nameList = new List();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
        new KKMultiServerThread(serverSocket.accept()).start();
        serverSocket.close();
    }
}

-------------------------------------------------------------
import java.net.*;
import java.io.*;
import java.awt.List;

public class KKMultiServerThread extends Thread {
    private Socket socket = null;


    public KKMultiServerThread(Socket socket) {
    super("KKMultiServerThread");
    this.socket = socket;
    }

    public void run() {

    try {
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    socket.getInputStream()));

        String inputLine, outputLine;
        KnockKnockProtocol kkp = new KnockKnockProtocol();
        outputLine = kkp.processInput(null);
        out.println(outputLine);

        while ((inputLine = in.readLine()) != null) {
        outputLine = kkp.processInput(inputLine);
        out.println(outputLine);
        if (outputLine.equals("Bye"))
            break;
        }
        out.close();
        in.close();
        socket.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}

---------------------------------------------------------------
import java.net.*;
import java.io.*;

public class KnockKnockProtocol {
    private static final int WAITING = 0;
    private static final int LogIn = 1;
    private static final int AllFine = 2;
    private static final int ANOTHER = 3;

    private static final int NUMJOKES = 5;

    private int state = WAITING;
    private int currentJoke = 0;

    private String[] clues = { "Turnip", "Little Old Lady", "Atch", "Who", "Who" };
    private String[] answers = { "Turnip the heat, it's cold in here!",
                                "I didn't know you could yodel!",
                                "Bless you!",
                                "Is there an owl in here?",
                                "Is there an echo in here?" };

    public String name = null;


    extern nameList ; <---  MIT GÆT



    public String processInput(String theInput) {
        String theOutput = null;


      if (state == WAITING) {
            theOutput = "What is your name?"; // client
            state = LogIn;
        } else

      if (state == LogIn) {
                  name = theInput;
                theOutput = "Welcome " + name + "\n To get all the names type 'list'";
                state = AllFine;
        } else

      if (state == AllFine && theInput.equalsIgnoreCase("list")) {
          theOutput = name ;
        } else



        if (state == LogIn) {
            if (theInput.equalsIgnoreCase("y")) {
                theOutput = "Knock! Knock!";
                if (currentJoke == (NUMJOKES - 1))
                    currentJoke = 0;
                else
                    currentJoke++;
                state = LogIn;
            } else {
                theOutput = "Bye.";
                state = WAITING;
            }
        }
        return theOutput;
    }
}
Avatar billede arne_v Ekspert
09. september 2005 - 17:55 #1
du kan ikke gøre det sådan

en oplagt mulighed var at sende den nameList med i constrctir til først
KKMultiServerThread og siden  KnockKnockProtocol
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:20 #2
ja men så bliver den ikke rettet dynamisk - men kun når der bliver lavet en ny af dem. Dvs den første client opdaer "vist" ikke at der kommer endnu en client
Avatar billede arne_v Ekspert
09. september 2005 - 18:23 #3
jo det gør den

du sende en reference til en List over

alle der bruger den reference vil bruge det samme List objekt og derfor se
ændringer til dette
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:25 #4
avs kan du lave og sende rettelserne - jeg forstå simplehen ikke hvad man skal gøre så ... hvordan vil du kompenceres for arbejdet?
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:25 #5
Jeg har sidder og rodet med det i 2 timer :(
Avatar billede arne_v Ekspert
09. september 2005 - 18:28 #6
du lærer jo ikke noget ved at andre laver det ...

men jeg kan godt give lidt fragmenter
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:28 #7
mit IP er            kkSocket = new Socket("80.163.10.78", 4444);

du skal nok indsætte dit eget :) skriv evt til eksperten_dk@game-content.com
Avatar billede arne_v Ekspert
09. september 2005 - 18:28 #8
public List nameList = new List();

->

private List nameList = new ArrayList();

fordi
- når vi sende med som argument er private nok
- man kan ikke instantiere en List
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:29 #9
jamen jeg lytter :)
Avatar billede arne_v Ekspert
09. september 2005 - 18:30 #10
while (listening)
        new KKMultiServerThread(serverSocket.accept()).start();
        serverSocket.close();

->

        while (listening)
        new KKMultiServerThread(nameList, serverSocket.accept()).start();
        serverSocket.close();
Avatar billede arne_v Ekspert
09. september 2005 - 18:30 #11
public class KKMultiServerThread extends Thread {
    private Socket socket = null;


    public KKMultiServerThread(Socket socket) {
    super("KKMultiServerThread");
    this.socket = socket;
    }

->

public class KKMultiServerThread extends Thread {
    private Socket socket = null;
    private List nameList;

    public KKMultiServerThread(List nameList, Socket socket) {
    super("KKMultiServerThread");
    this.socket = socket;
    this.nameList = nameList;
    }
Avatar billede arne_v Ekspert
09. september 2005 - 18:31 #12
KnockKnockProtocol kkp = new KnockKnockProtocol();

->

KnockKnockProtocol kkp = new KnockKnockProtocol(nameList);
Avatar billede arne_v Ekspert
09. september 2005 - 18:32 #13
public class KnockKnockProtocol {
  ...
    extern nameList ; <---  MIT GÆT
  ...

->


public class KnockKnockProtocol {
  ...
  private List nameList;
  public KnockKnockProtocol(List nameList) {
        this.nameList = nameList;
  }
  ...
Avatar billede arne_v Ekspert
09. september 2005 - 18:32 #14
der er muligvis andre ting som skal rettes, men det her er da en start
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:32 #15
ok ... det kan sige kort jeg er en idiot ....
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 18:41 #16
tak ... kom med et svar og lad os lukke spm :)
Avatar billede arne_v Ekspert
09. september 2005 - 18:48 #17
ok
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 19:10 #18
har du kompileret den ?
Avatar billede arne_v Ekspert
09. september 2005 - 19:16 #19
næh - der kan sagtens tænkes at være andre problemer, men du ved godt hvordan man går
til Kina ikke ? først et skridt, så et mere og så .....
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 20:03 #20
sidder nu med en
C:\Documents and Settings\Dyret Ole\Skrivebord\DIST\opgave1\KKMultiServer.java:11: non-static method somethingNoneStatic() cannot be referenced from a static context
        int b = somethingNoneStatic();
                        ^
1 error

Tool completed with exit code 1


Jeg mener det er et standard trik at komme væk fra static metoder

------------------------------------------------------------------------
import java.net.*;
import java.io.*;
import java.awt.List;
public class KKMultiServer {

public List nameList;

    public static void main(String[] args) throws IOException {

    try{
        int b = somethingNoneStatic();
        } catch (Exception e) {
        System.err.println("somethingNoneStatic()"+ e);

        }
    }

    public int somethingNoneStatic(){
            ServerSocket serverSocket = null;
            boolean listening = true;

            try {
                serverSocket = new ServerSocket(4444);
            } catch (IOException e) {
                System.err.println("Could not listen on port: 4444.");
                System.exit(-1);
            }

            while (listening)

            try {
            new KKMultiServerThread( nameList,serverSocket.accept()).start();
            serverSocket.close();
            } catch (Exception e) {
        System.err.println("KKMultiServerThread()"+ e);

            }

        }


}
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 20:04 #21
hvis du har tid igen :) .... efter en krig af rettelser
Avatar billede oleoldhoj Nybegynder
09. september 2005 - 20:11 #22
igen ... jeg er en spade .... :) er du gal det er lang tid siden jeg har kodet Java .... men tak for den moralske opbakning :)
Avatar billede arne_v Ekspert
09. september 2005 - 21:34 #23
enten skal du erklære

    public static int somethingNoneStatic(){

eller så skal du have en instans:

KKMultiServer kkms = new KKMultiServer();
int b = kkms.somethingNoneStatic();
Avatar billede arne_v Ekspert
29. september 2005 - 20:24 #24
OK ?
Avatar billede oleoldhoj Nybegynder
29. september 2005 - 23:16 #25
jamen det var mig der var spade dum .... jeg tænkte bare for meget C++ og ikke Java
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester