Avatar billede Slettet bruger
17. oktober 2011 - 09:44 Der er 7 kommentarer og
1 løsning

Socket Programmering

Hej

Jeg har tjekket rundt på nettet og i arkivet efter lignende tråd, men jeg synes ikke at finde noget, hvilket kommer bag på mig. Derfor håber jeg i vil hjælpe mig.

Jeg har efterhånden arbejdet lidt med client/server arkitekturen. Men jeg har kun fået serveren til at sende et svar til den client som sender beskeden, Hvordan sender jeg det til en anden client

Hilsen

Jonas
Avatar billede arne_v Ekspert
17. oktober 2011 - 13:56 #1
Hvis du har en ArrayList<Socket> med alle de accept'ede Socket er det nemt at sende til dem alle.
Avatar billede Slettet bruger
17. oktober 2011 - 14:43 #2
Hmm ja, kender du et sted hvor der ligger et kode eksempel, jeg kan sidde og lege med?
Avatar billede arne_v Ekspert
17. oktober 2011 - 15:14 #3
Et eksempel fra et andet spoergsmaal her paa eksperten.dk:

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 Slettet bruger
17. oktober 2011 - 16:40 #4
Jeg har lige siddet og kigget koden igennem.

Dvs. jeg kan tildele en masse Socket forbindelser til listen i selve server klassen også vil alle beskeder min klient sender til serveren sende til de Sockets der ligger i Listen?
Avatar billede arne_v Ekspert
17. oktober 2011 - 18:54 #5
Ikke per automatik. Det skal stadig kodes. Men det goer det muligt at kode.

Men naar en client handler traad oensker at sende til alle klienter saa tager den fat i listen og sender til alle.
Avatar billede Slettet bruger
17. oktober 2011 - 18:57 #6
Yes. Jeg tror umiddelbart også det var min tanke. I hvert fald var det et rigtig godt svar du gav mig. Sender du et svar så du kan få point. :D.

Og tusind tak for din hjælp
Avatar billede arne_v Ekspert
17. oktober 2011 - 19:04 #7
svar
Avatar billede arne_v Ekspert
17. oktober 2011 - 19:05 #8
Husk ioevrigt at modellem med en traad per client er behagelig at kode efter, men at det ikke skalerer saa godt.

Jeg ville ikke bruge det til mere end 250-500 klienter.
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