TCP-und UDP-Anfragen auf den selben port

Ich Schreibe eine Client - /Server-Programme

Je nach operation, die vom client angefordert, die ich verwenden, stellen Sie die TCP-oder UDP-Anfrage.

Implementierung der client-Seite ist straight-forward, da kann ich leicht öffnen Sie Verbindung mit einem beliebigen Protokoll und senden Sie die Anfrage an der server-Seite.

Auf der Server-Seite, auf der anderen Seite, würde ich gerne hören, sowohl für die UDP-und TCP-verbindungen auf dem gleichen port. Außerdem mag ich die der server zum öffnen von neuen Threads für jede Verbindung Anfrage.

Habe ich angenommen, das Konzept erläutert: link-text

Habe ich erweitert dieses code-Beispiel durch das erstellen von neuen threads für die einzelnen TCP/UDP-Anfrage.

Dies funktioniert einwandfrei, wenn ich nur TCP, aber es schlägt fehl, wenn ich Versuch zu machen, UDP-Bindungen.

Bitte geben Sie mir irgendeinen Vorschlag, wie kann ich das korrigieren.

tnx

Hier ist der Server-Code:

public class Server {
public static void main(String args[]) {
    try {
        int port = 4444;
        if (args.length > 0)
            port = Integer.parseInt(args[0]);

        SocketAddress localport = new InetSocketAddress(port);

        //Create and bind a tcp channel to listen for connections on.
        ServerSocketChannel tcpserver = ServerSocketChannel.open();
        tcpserver.socket().bind(localport);

        //Also create and bind a DatagramChannel to listen on.
        DatagramChannel udpserver = DatagramChannel.open();
        udpserver.socket().bind(localport);

        //Specify non-blocking mode for both channels, since our
        //Selector object will be doing the blocking for us.
        tcpserver.configureBlocking(false);
        udpserver.configureBlocking(false);

        //The Selector object is what allows us to block while waiting
        //for activity on either of the two channels.
        Selector selector = Selector.open();

        tcpserver.register(selector, SelectionKey.OP_ACCEPT);
        udpserver.register(selector, SelectionKey.OP_READ);

        System.out.println("Server Sterted on port: " + port + "!");

        //Load Map
        Utils.LoadMap("mapa");
        System.out.println("Server map ... LOADED!");

        //Now loop forever, processing client connections
        while(true) {
            try { 
                selector.select();
                Set<SelectionKey> keys = selector.selectedKeys();

                //Iterate through the Set of keys.
                for (Iterator<SelectionKey> i = keys.iterator(); i.hasNext();) {
                    SelectionKey key = i.next();
                    i.remove();

                    Channel c = key.channel();

                    if (key.isAcceptable() && c == tcpserver) {
                        new TCPThread(tcpserver.accept().socket()).start();
                    } else if (key.isReadable() && c == udpserver) {
                        new UDPThread(udpserver.socket()).start();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println(e);
        System.exit(1);
    }
}

}

Den UDPThread code:

public class UDPThread extends Thread {
private DatagramSocket socket = null;

public UDPThread(DatagramSocket socket) {
    super("UDPThread");
    this.socket = socket;
}

@Override
public void run() {
    byte[] buffer = new byte[2048];
    try {           
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        socket.receive(packet);

        String inputLine = new String(buffer);
        String outputLine = Utils.processCommand(inputLine.trim());

        DatagramPacket reply = new DatagramPacket(outputLine.getBytes(), outputLine.getBytes().length,
                                                  packet.getAddress(), packet.getPort());
        socket.send(reply);

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

}

Ich erhalten:

Exception in thread "UDPThread" java.nio.channels.IllegalBlockingModeException
at sun.nio.ch.DatagramSocketAdaptor.receive(Unknown Source)
at server.UDPThread.run(UDPThread.java:25)

10x

  • Schlägt fehl, wie? Haben Sie mehr Informationen, wie Fehlermeldungen oder Beispielcode?
  • Bitte erläutern Sie "schlägt es" im detail.
InformationsquelleAutor msaveski | 2010-05-12
Schreibe einen Kommentar