Как получить номер порта из стандартного ввода для браузера / сервера - PullRequest
0 голосов
/ 12 июля 2011

Я читаю Изучение Java от О'Рейли и пытаюсь запрограммировать класс TinyHttpd из главы «Сетевое программирование».Проблема, с которой я сталкиваюсь, заключается в извлечении номера порта из Терминала.В качестве обходного пути я создал номер порта по умолчанию, но это тоже не удалось.Любая помощь будет принята с благодарностью.

import java.net.*;
import java.io.*;
import java.util.regex.*;
import java.util.concurrent.*;

public class TinyHttpd {
    public static final int DEFAULT_PORT = 1234;
    public static void main (String argv[] ) throws IOException {
        Executor executor = Executors.newFixedThreadPool(3);
        int port = DEFAULT_PORT;
        ServerSocket ss = null;
        if(argv.length>0){
                 ss = new ServerSocket( Integer.parseInt(argv[0]));
        }
        else{
            ss = new ServerSocket(port);
        }
        while(true)
            executor.execute( new TinyHttpdConnection( ss.accept( ) ) );
    }
}  

class TinyHttpdConnection implements Runnable {
    Socket client;
    TinyHttpdConnection ( Socket client ) throws SocketException {
        this.client = client;
    }

    public void run( ){
        try{
            BufferedReader in = new BufferedReader( 
                new InputStreamReader( client.getInputStream( ), "8859_1" )     );
            OutputStream out = client.getOutputStream( );
            PrintWriter pout = new PrintWriter(
                new OutputStreamWriter ( out, "8859_1"), true);
            String request = in.readLine( );
            System.out.println( "Request: " + request);
            Matcher get = Pattern.compile("GET /?(\\S*).*").matcher( request );
            if ( get.matches( ) ){
                request = get.group(1);
                if ( request.endsWith("/") || request.equals("") )
                    request = request + "index.html";
                try {
                FileInputStream fis = new FileInputStream( request     );
                    byte [] data = new byte [64*1024];
                    for(int read; (read = fis.read( data )) > -1;)
                        out.write( data, 0, read );
                    out.flush( );
                } catch ( FileNotFoundException e){
                    pout.println( "404 Object not found");
                }
            } else
                pout.println( "400 Bad Request" );
            client.close( );
        } catch ( IOException e) {
            System.out.println( "I/O error " +  e ); }
    }
}

1 Ответ

0 голосов
/ 12 июля 2011

С кодом, который вы разместили в своем вопросе, я могу выполнить эту последовательность шагов в оболочке bash:

  1. Переключиться в каталог проектов
  2. mkdir tinyhttpd
  3. cd tinyhttpd
  4. vi TinyHttpd.java
  5. Скопируйте код полностью в новый файл, :x, чтобы сохранить и выйти.
  6. javac TinyHttpd.java
  7. java TinyHttpd 1235

Запускает сервер на порт 1235 вместо порта по умолчанию 1234. Порт по умолчанию также работает, если вы не указали порт.Я подтвердил это с помощью nc localhost 1235, за которым следовал GET /<Enter>, который получил ожидаемый "404 объект не найден", так как у меня нет index.html.Добавление index.html с содержимым «hello world» заставляет его возвращать эту строку, как и ожидалось.

...