/* * Copyright (C) 2005 Luca Veltri - University of Parma - Italy * * This file is part of MjSip (http://www.mjsip.org) * * MjSip is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MjSip is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MjSip; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author(s): * Luca Veltri (luca.veltri@unipr.it) */ package org.zoolu.net; import java.net.ServerSocket; import java.io.InterruptedIOException; /** TcpServer implements a TCP server wainting for incoming connection. */ public class TcpServer extends Thread { /** Default value for the maximum time that the tcp server can remain active after been halted (in milliseconds) */ public static final int DEFAULT_SOCKET_TIMEOUT=5000; // 5sec /** Default ServerSocket backlog value */ static int socket_backlog=50; /** The protocol type */ //protected static final String PROTO="tcp"; /** The TCP server socket */ ServerSocket server_socket; /** Maximum time that the connection can remain active after been halted (in milliseconds) */ int socket_timeout; /** Maximum time that the server remains active without incoming connections (in milliseconds) */ long alive_time; /** Whether it has been halted */ boolean stop; /** Whether it is running */ boolean is_running; /** TcpServer listener */ TcpServerListener listener; /** Costructs a new TcpServer */ public TcpServer(int port, TcpServerListener listener) throws java.io.IOException { init(port,null,0,listener); start(); } /** Costructs a new TcpServer */ public TcpServer(int port, IpAddress bind_ipaddr, TcpServerListener listener) throws java.io.IOException { init(port,bind_ipaddr,0,listener); start(); } /** Costructs a new TcpServer */ public TcpServer(int port, IpAddress bind_ipaddr, long alive_time, TcpServerListener listener) throws java.io.IOException { init(port,bind_ipaddr,alive_time,listener); start(); } /** Inits the TcpServer */ private void init(int port, IpAddress bind_ipaddr, long alive_time, TcpServerListener listener) throws java.io.IOException { this.listener=listener; if (bind_ipaddr==null) server_socket=new ServerSocket(port); else server_socket=new ServerSocket(port,socket_backlog,bind_ipaddr.getInetAddress()); this.socket_timeout=DEFAULT_SOCKET_TIMEOUT; this.alive_time=alive_time; this.stop=false; this.is_running=true; } /** Whether the service is running */ public boolean isRunning() { return is_running; } /** Stops running */ public void halt() { stop=true; } /** Runs the server */ public void run() { Exception error=null; try { server_socket.setSoTimeout(socket_timeout); long expire=0; if (alive_time>0) expire=System.currentTimeMillis()+alive_time; // loop while (!stop) { TcpSocket socket=null; try { socket=new TcpSocket(server_socket.accept()); } catch (InterruptedIOException ie) { if (alive_time>0 && System.currentTimeMillis()>expire) halt(); continue; } if (listener!=null) listener.onIncomingConnection(this,socket); if (alive_time>0) expire=System.currentTimeMillis()+alive_time; } } catch (Exception e) { error=e; stop=true; } is_running=false; try { server_socket.close(); } catch (java.io.IOException e) {} server_socket=null; if (listener!=null) listener.onServerTerminated(this,error); listener=null; } /** Gets a String representation of the Object */ public String toString() { return "tcp:"+server_socket.getInetAddress()+":"+server_socket.getLocalPort(); } }