# Neues NIO problem nachricht an alle clients



## Hakkemaster (24. Jan 2010)

Hallo,

ich komme leider wieder nicht weiter 

und zwar sende ich von Client1 aus eine Nachricht diese kann aber auch nur Client1 lesen und nicht Client2. Aber Client2 - ClientN soll das ja auch lesen können. Ich habe aber keine idee wie ich das machen soll

Mein server code ist:


```
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;
import java.nio.charset.*;

public class NonBlockingServer {

    public Selector sel = null;
    public ServerSocketChannel server = null;
    public SocketChannel socket = null;
    public int port = 4900;
    String result = null;

    public NonBlockingServer() {
        System.out.println("Inside default ctor");
    }

    public NonBlockingServer(int port) {
        System.out.println("Inside the other ctor");
        port = port;
    }

    public void initializeOperations()
            throws IOException, UnknownHostException {
        System.out.println("Inside initialization");
        sel = Selector.open();
        server = ServerSocketChannel.open();
        server.configureBlocking(false);
        InetAddress ia = InetAddress.getLocalHost();
        InetSocketAddress isa =
                new InetSocketAddress(ia, port);
        server.socket().bind(isa);
    }

    public void startServer() throws IOException {
        System.out.println("Inside startserver");
        initializeOperations();
        System.out.println("Abt to block on select()");
        SelectionKey acceptKey = server.register(sel,
                SelectionKey.OP_ACCEPT);
        while (acceptKey.selector().select() > 0) {
            Set readyKeys = sel.selectedKeys();
            Iterator it = readyKeys.iterator();
            while (it.hasNext()) {
                SelectionKey key =
                        (SelectionKey) it.next();
                it.remove();
                if (key.isAcceptable()) {
                    System.out.println(
                            "Key is Acceptable");
                    ServerSocketChannel ssc =
                            (ServerSocketChannel) key.channel();
                    socket =
                            (SocketChannel) ssc.accept();
                    socket.configureBlocking(false);
                    SelectionKey another =
                            socket.register(sel,
                            SelectionKey.OP_READ
                            | SelectionKey.OP_WRITE);
                }
                System.out.println(socket);
                if (key.isReadable()) {
                    System.out.println(
                            "Key is readable");
                    String ret = readMessage(key);
                    if (ret.length() > 0) {
                        writeMessage(
                                socket, ret);
                    }
                }
                if (key.isWritable()) {
                    System.out.println("THe key is writable" +key.hashCode());
                    String ret = readMessage(key);
                    socket = (SocketChannel) key.channel();

                    if (result.length() > 0) {
                        writeMessage(
                                socket, ret);
                    }
                }
            }
        }
    }

    public void writeMessage(SocketChannel socket, String ret) {
        System.out.println("Inside the loop");
        if (ret.equals("quit") || ret.equals("shutdown")) {
            return;
        }
        System.out.println(ret.getBytes().length);
        try {
            int nBytes = socket.write(ByteBuffer.wrap(ret.getBytes()));
            System.out.println("nBytes = " + nBytes);
            result = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String readMessage(SelectionKey key) {
        socket = (SocketChannel) key.channel();
        ByteBuffer buf = ByteBuffer.allocate(1024);
        try {
            socket.read(buf);
            buf.flip();
            Charset charset =
                    Charset.forName("us-ascii");
            CharsetDecoder decoder =
                    charset.newDecoder();
            CharBuffer charBuffer = decoder.decode(buf);
            result = charBuffer.toString();
            charBuffer.clear();
        } catch (IOException e) {
            e.printStackTrace();
        }
        buf.clear();
        return result;
    }

    public static void main(String args[]) {
        NonBlockingServer nb = new NonBlockingServer();
        try {
            nb.startServer();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
```

Wäre super wenn mir jemand nochmal helfen könnte


----------



## tuxedo (25. Jan 2010)

Na du wirst dir im Server eine Liste mit Client-Sockets anlegen müssen, so dass du, wenn Client1 eine Nachricht schickt, der Server diese an alle in der Liste schickt. Dazu einfach über die Liste iterieren und an jeden die Nachricht senden. Einen integrierten Befehl "sende an alle" gibt es nicht. Das musst du selbst machen.


btw: Kleiner Tipp: mit "xSocket" machst du dir das Leben auf NIO Ebene leichter. Wenn du ein etwas aufwendigeres Protokoll hast, wirds mit "MINA" oder "NETTY" nochmal einfacher.

Gruß
Alex


----------



## Hakkemaster (25. Jan 2010)

okay dann versuch ichs mal mit xSocket 

gibt es vielleicht tutorials auf deutsch oder muss man sich durch die doku + api kämpfen?


----------



## tuxedo (26. Jan 2010)

Soweit ich mich erinnern kann waren die Samples auf der Projektseite für's verständnis ausreichend. 
Mit englischen Tutorials wirst du dich wohl oder übel anfreunden müssen wenn du weiter mit Java arbeiten willst.

-Alex


----------

