Avatar billede lakana Nybegynder
31. juli 2006 - 01:59 Der er 21 kommentarer og
1 løsning

Multi threading server?

En der sidder inde med en Multi threading server i java?

Den skal:
- Acceptere alle der kommer ind og lytter på serveren
- Den skal lytte på port 9999
- Den skal skrive tilbage til clienten, om at en klient er blevet lukket ( ligesom jeg fx lukker eksperten, skal den vide det )

- På forhånd rigtigt mange tak. Jeg søger sådan en rigtigt meget!
Avatar billede arne_v Ekspert
31. juli 2006 - 02:06 #1
jeg lavede følgende kode for en tre måneder siden:

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

public class Server {
    public static void main(String[] args) {
        try {
            List lst = new ArrayList();
            ServerSocket ss = new ServerSocket(12345);
            while(true) {
                Socket s = ss.accept();
                ClientHandler cli = new ClientHandler(s, lst);
                cli.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

class ClientHandler extends Thread {
    private Socket s;
    private BufferedReader br;
    private PrintWriter pw;
    private List lst;
    private String user;
    public ClientHandler(Socket s, List lst) {
        try {
            this.s = s;
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            pw = new PrintWriter(s.getOutputStream(), true);
            this.lst = lst;
            user = "not logged in";
            lst.add(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void run() {
        try {
            String line;
            while((line = br.readLine()) != null) {
                if(line.substring(0,6).equals("LOGIN ")) {
                    user = line.substring(6);
                    System.out.println(user + " login");
                } else if(line.substring(0,5).equals("SEND ")) {
                    String msg = line.substring(5);
                    for(int i = 0; i < lst.size(); i++) {
                        ClientHandler cli = (ClientHandler)lst.get(i);
                        if(cli != this) {
                            cli.send(msg);
                            System.out.println(msg + " send to " + cli.user);
                        }
                    }
                } else {
                    System.out.println("Unknown command : " + line);
                }
            }
        } catch (IOException e) {
            // nothing
        } finally {
            lst.remove(this);
        }
    }
    public void send(String msg) {
        pw.println(msg);
    }
}
Avatar billede arne_v Ekspert
31. juli 2006 - 02:08 #2
ikke helt det samme som du skal bruge, men der må være nogle ideer at hapse
Avatar billede lakana Nybegynder
31. juli 2006 - 02:11 #3
har ikke forstand på Java, intet forstand. Jeg skal kun bruge det til mit socket-værk som kører på Flash, så det må jeg desværre sige nej til at hapse.

Men hvis du nu sidder og kede-hygger dig, så må du gerne lave sådan en "simpel" (som jeg vil kalde det) server.

- Lytte på port 9999
- Udskrive det den modtager i console, og sende det tilbage på port 9999.
- Fortælle at en client er blevet lukket
- Mutli threading.

Er det noget du kan lave?
Avatar billede arne_v Ekspert
31. juli 2006 - 04:11 #4
package july;

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

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(9999);
            while(true) {
                Socket s = ss.accept();
                ClientHandler cli = new ClientHandler(s);
                cli.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

class ClientHandler extends Thread {
    private BufferedReader br;
    private PrintWriter pw;
    public ClientHandler(Socket s) {
        try {
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            pw = new PrintWriter(s.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void run() {
        try {
            String line;
            while((line = br.readLine()) != null) {
                System.out.println(line);
                pw.println(line);
                pw.flush();
            }
        } catch (IOException e) {
            // nothing
        } finally {
            System.out.println("Client leaving");
        }
    }
}
Avatar billede arne_v Ekspert
31. juli 2006 - 04:12 #5
men hvis ikke du kender Java - kan du så builde og køre ?
Avatar billede lakana Nybegynder
31. juli 2006 - 12:00 #6
hej Arne. ja jeg har blueJ installeret .

og kører det via cmd..

hvorfor har du en package på?behøves det?
Avatar billede lakana Nybegynder
31. juli 2006 - 12:13 #7
det virker perfekt. dog er den ligesom 'bag' ud, når den skal sende tilbage til min flash-client.

Den sender ikke helt som den skal. Jeg bruger følgende nu:

          while((line = br.readLine()) != null) {
                pw.println(line + '\n');
                pw.flush();
               
                System.out.println(line);

Hvordan kan det være?
Avatar billede lakana Nybegynder
01. august 2006 - 03:24 #8
undskyld mig, men arne v?

Det jeg prøver at fortælle, er at hvis den modtager fx data med:
LOGIN,arne_v,123456

Så skal den automatisk sende tilbage til port 9999 og servernavnet: www.domain.dk
Avatar billede arne_v Ekspert
01. august 2006 - 04:06 #9
+ '\n'

bør ikke være nødvendig da println selv sender \r\n efter hver linie
Avatar billede arne_v Ekspert
01. august 2006 - 04:07 #10
koden echoer tilbage uændret

hvis du vil appende server navn så

pw.println(line + "," + InetAddress.getLocalHost().getHostAddress());
Avatar billede lakana Nybegynder
01. august 2006 - 04:30 #11
ved ikke om du har forstået mig ret, men den skal sende til ALLE på klienten på port 9999.

I min flash klient connecter den til min ip-adresse.

Så kan man ikke få den til at sende ud til min ip-adresse?

fx

connect("ip",port); ?
Avatar billede lakana Nybegynder
01. august 2006 - 04:34 #12
det er nemlig somom man skal gøre tingene 2 gange før serveren i flash svarer tilbage
Avatar billede lakana Nybegynder
01. august 2006 - 04:40 #13
Kunne bedre forstå.. får ikke engang data'en tilbage til flash-klienten
Avatar billede lakana Nybegynder
02. august 2006 - 00:01 #14
er der respons arne?
Avatar billede arne_v Ekspert
02. august 2006 - 00:39 #15
jeg tror at jeg melder pas - jeg kan ikke længere finde hoved eller hale
i hvad programmet skal kunne
Avatar billede lakana Nybegynder
02. august 2006 - 00:53 #16
Altså.. det virker jo næsten.. tag det med ro. det er måske bare mig som er lidt skør da jeg ikke kender java.

den skal bare oprette forbindelse til en ip og port fx ip "80.23.133.122" også port 9999, også skal den LYTTE på port 9999 og når den skal sende tilbage til klienten, så skal den jo oprette forbindelse til ip'ern, og ikke bare sende direkte over port 9999.
Avatar billede lakana Nybegynder
02. august 2006 - 01:42 #17
Kan jeg ikke skrive tilbage til serveren, uden den laver \n\r ?

Den skal bare sende fx hvis den modtager:
LOGIN,arne_v

så skal den sende det
Avatar billede lakana Nybegynder
02. august 2006 - 01:56 #18
Arne kan det være fordi jeg skal sende noget specielt når jeg sender til serveren?

Skal jeg sende \n ? \r  efter stringen eller hvad?
Avatar billede lakana Nybegynder
03. august 2006 - 01:33 #19
hallo arne?
Avatar billede lakana Nybegynder
03. august 2006 - 01:37 #20
jeg spørger igen:
Skal jeg sende noget efter det jeg sender til serveren????????????????

fx \r eller \n ???? for nu har jeg prøvet alt
Avatar billede arne_v Ekspert
03. august 2006 - 14:58 #21
jeg tror at du har misforstaet konceptet paa www.eksperten.dk

du har ikke krav paa ekspert hjaelp

hvis der er nogen som synes at det er sjovt at loese dit problem, saa faar du hjaelp

og det er der naesten altid

hvis du vil have krav paa at faa loest dit problem saa ring til en konsulent - for
400-1000 kr. i timen vil han bruge al den tid du oensker paa dit problem
Avatar billede lakana Nybegynder
05. august 2006 - 17:40 #22
HMM!!!
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