📄 dxmultiserver.java
字号:
// You can redistribute this software and/or modify it under the terms of// the Ozone Library License version 1 published by ozone-db.org.//// The original code and portions created by SMB are// Copyright (C) 1997-2000 by SMB GmbH. All rights reserved.//// $Id: DxMultiServer.java,v 1.9 2000/10/28 16:55:15 daniela Exp $package org.ozoneDB.DxLib.net;import java.io.*;import java.net.*;import org.ozoneDB.DxLib.*;/** * DxMultiServer verwaltet mehrere DxClients - Verbindungen. Durch einen Thread * wird staendig auf neue Verbindungen gewartet, durch einen weiteren auf * einkommende Daten. Wird etwas empfangen, wird die Methode handleClientEvent() * aufgerufen. * * * @author <a href="http://www.softwarebuero.de/">SMB</a> * @version $Revision: 1.9 $Date: 2000/10/28 16:55:15 $ */public abstract class DxMultiServer extends DxListBag { protected ServerSocket serverSocket; protected Acceptor acceptor; protected Thread acceptThread; protected ThreadGroup threadGroup; public DxMultiServer( int port ) throws IOException{ serverSocket = new ServerSocket( port ); acceptor = new Acceptor( this ); threadGroup = new ThreadGroup( getClass().getName() ); acceptThread = newThread( acceptor ); } /** * liefert die ThreadGroup des MultiServers. */ public ThreadGroup threadGroup() { return threadGroup; } /** * Diese Methode liefert einen neuen Thread und wird fuer die AcceptThread * und den DxMultiServerClient benoetigt. Sie kann ueberschrieben werden, um evtl. * eigene Threads zu erzeugen (z.B. bei Verwendung eines eigenen Schedulers). * Ausserdem wird der mit diesem Thread verbundene Client uebergeben (kann * auch null sein !!). */ public Thread newThread( Runnable run ) { return new Thread( threadGroup(), run ); } /** * erzeugt einen neuen client aus einer socket-verbindung; * diese methode kann ueberschrieben werden, um evtl. eigene clients * einfuegen zu koennen */ public synchronized DxMultiServerClient newClient( Socket sock ) { try { return new DxMultiServerClient( sock, this ); } catch (Exception e) { return null; } } /** accept thread starten */ public void accept() { if (!acceptThread.isAlive()) { acceptThread.start(); } } public void close() throws IOException { acceptThread.stop(); DxIterator it = iterator(); while (it.next() != null) { ((DxMultiServerClient)it.object()).close(); } serverSocket.close(); } public synchronized void removeClient( DxMultiServerClient client ) { DxIterator it = iterator(); DxMultiServerClient cl; while ((cl = (DxMultiServerClient)it.next()) != null) { if (cl == client) { it.removeObject(); cl.close(); return; } } throw new RuntimeException( "removeClient(): no such client." ); } /** * diese methode wird aufgerufen, wenn an der verbindung client daten * anliegen; muss ueberschrieben werden, um das applications spezifische * verhalten zu bestimmen */ public abstract void handleClientEvent( DxMultiServerClient client, Object event ); public abstract void handleClientException( DxMultiServerClient client, Exception e );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -