001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.io.remotecontrol; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.io.IOException; 007 import java.net.BindException; 008 import java.net.ServerSocket; 009 import java.net.Socket; 010 import java.net.SocketException; 011 import java.net.InetAddress; 012 013 /** 014 * Simple HTTP server that spawns a {@link RequestProcessor} for every 015 * connection. 016 * 017 * Taken from YWMS plugin by frsantos. 018 */ 019 public class RemoteControlHttpServer extends Thread { 020 021 /** Default port for the HTTP server */ 022 public static final int DEFAULT_PORT = 8111; 023 024 /** The server socket */ 025 private ServerSocket server; 026 027 private static RemoteControlHttpServer instance; 028 029 /** 030 * Starts or restarts the HTTP server 031 */ 032 public static void restartRemoteControlHttpServer() { 033 try { 034 if (instance != null) { 035 instance.stopServer(); 036 } 037 038 instance = new RemoteControlHttpServer(DEFAULT_PORT); 039 instance.start(); 040 } catch (BindException ex) { 041 System.err.println(tr("Warning: Cannot start remotecontrol server on port {0}: {1}", 042 Integer.toString(DEFAULT_PORT), ex.getLocalizedMessage())); 043 } catch (IOException ioe) { 044 ioe.printStackTrace(); 045 } 046 } 047 048 /** 049 * Constructor 050 * @param port The port this server will listen on 051 * @throws IOException when connection errors 052 */ 053 public RemoteControlHttpServer(int port) 054 throws IOException 055 { 056 super("RemoteControl HTTP Server"); 057 this.setDaemon(true); 058 // Start the server socket with only 1 connection. 059 // Also make sure we only listen 060 // on the local interface so nobody from the outside can connect! 061 this.server = new ServerSocket(port, 1, 062 InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 })); 063 } 064 065 /** 066 * The main loop, spawns a {@link RequestProcessor} for each connection 067 */ 068 public void run() 069 { 070 System.out.println("RemoteControl::Accepting connections on port " + server.getLocalPort()); 071 while (true) 072 { 073 try 074 { 075 Socket request = server.accept(); 076 RequestProcessor.processRequest(request); 077 } 078 catch( SocketException se) 079 { 080 if( !server.isClosed() ) 081 se.printStackTrace(); 082 } 083 catch (IOException ioe) 084 { 085 ioe.printStackTrace(); 086 } 087 } 088 } 089 090 /** 091 * Stops the HTTP server 092 * 093 * @throws IOException 094 */ 095 public void stopServer() throws IOException 096 { 097 server.close(); 098 } 099 }