lyssna efter inkommande data från flera klienter samtidigt?

Permalänk

lyssna efter inkommande data från flera klienter samtidigt?

Hej, jag har skrivit ett server/client program med en server som kan ha flera klienter samtidigt connectade. när någon connectar lägger jag till dom i en arraylist.

ArrayList<Socket> connectedClients = new ArrayList<Socket>();

och då undrar jag hur kan jag lyssna efter inkommande data från alla samtidigt (det kommer vara max 4 klienter connectade på en och samma gång om det hjälper). om jag förklarat dåligt fråga bara

edit: datan är i text format

Visa signatur

Att programmera eller att inte programmera, det är frågan?

Permalänk
Medlem

hej, jag vet inte om det är ett krav att du ska ha en lista med sockets men det är inte så skalbart att läsa socket input sekventiellt. Om det är att krav kan du läsa på om SocketChannel/ServerSocketChannel/NIO som löser problemet med blockerande socket input/output (men jag tycker det kanske är lite overkill just nu)

Förslag på vanlig enkel lösning är att skapa en tråd för varje klient och läsa input från dem parallellt. Se min halv-pseudo java nedan, borde gå att översätta (saknas lite try/catch, imports och kanske syntax)

class ServerHandler { public void startServer() { ServerSocket serverSock = new ServerSocket(6677); ClientSockWorker client = null; while (true) { client = new ClientSockWorker(serverSock.accept()); //blockar till connection skapats new Thread(client).start();//skapar och startar en ny tråd som kallar på objektets(client) run()-metod //tips är att kanske spara client-objekten i en lista så du har lite kontroll över vad som kör och kan limitera till 4 connections t ex } } class ClientSockWorker implements Runnable { Socket sock; boolean clientConnected = false; ClientSockWorker(Socket sock) { this.sock = sock; } public void run(){ clientConnected = true; while (clientConnected) { //gör något med sock.getInputStream(); //när socketen inte längre går att läsa från sätt clientConnected=false; } } } public static void main(String[] args){ new ServerHandler().startServer(); } }

ClientSockWorker blir då en wrapper runt socketen och dessa objekt skulle du ju då kunna lagra i en lista på samma sätt som du gjorde med råa sockets. När du vill svara klienten kan du ju referera till attributet "sock" från wrappern.