2015-03-25 4 views
0

Цель:Java Вебсервер не отвечает

Моя цель с этим кодом, чтобы создать простой веб-сервер, который может обрабатывать несколько клиентов, и это будет реагировать с HTML, чтобы сказать «привет», когда клиент запрашивает его ,

Код:

Вот тест номер один. Он может обрабатывать только один клиент один раз:

import java.net.*; 
import java.io.*; 
public class Webserver1 { 
    public static void main(String[] args) { 
     ServerSocket ss; 
     Socket s; 
     try { 
      //set up connection 
      ss = new ServerSocket(80); 
      s = ss.accept(); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      return; 
     } 
     try (
       BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       DataOutputStream out = new DataOutputStream (s.getOutputStream()); 
       ) { 
      String inline = in.readLine(); 
      //http request 
      if (inline.startsWith("GET")) { 
      //return http 
       out.writeBytes("<!doctype html><html><body><p>hi</p></body></html>"); 
      } 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

Вот тест номер два. Он предназначен для работы с несколькими клиентами:

import java.net.*; 
import java.io.*; 
public class Webserver2 { 
//class to handle connections 
    public static class server { 
     ServerSocket ss; 
     Socket s[] = new Socket[maxn]; 
     public server() { 
      try { 
      ss = new ServerSocket(80); 
      } catch (Exception e) { 
       System.out.println(e.getMessage()); 
      } 
    } 
     public InputStream getis(int num) throws Exception { 
      return s[num].getInputStream(); 
     } 
     public OutputStream getos(int num) throws Exception { 
      return s[num].getOutputStream(); 
     } 
     public void close() throws Exception { 
      for (int i = 0; i < numc; i++) { 
      s[i].close(); 
      } 
     } 
     public void newc() throws Exception { 
      s[numc + 1] = ss.accept(); 
     } 
    } 
    static int numc = 0; 
    static final int maxn = 100; 
    static server se = new server(); 
    public static void main(String[] args) { 
     try { 
     while (numc < 6) { 
     //set up connection, and start new thread 
     se.newc(); 
     numc++; 
     System.out.println("0"); 
     (new Client()).start(); 
     } 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
    public static class Client extends Thread { 
     public void run() { 
      try(
        BufferedReader in = new BufferedReader(new InputStreamReader(se.getis(numc))); 
        DataOutputStream out = new DataOutputStream (se.getos(numc)); 
        ) { 
       String inline; 
       while(true) { 
         inline = in.readLine(); 
         //wait for http request 
        if (inline.startsWith("GET")) { 
         System.out.println("1"); 
         //respond with header, and html 
         out.writeBytes("HTTP/1.1 200 OK\r\n"); 
         out.writeBytes("Connection: close\r\n"); 
         out.writeBytes("Content-Type: text/html\r\n\r\n"); 
         out.writeBytes("<!doctype html><html><body><p>hi</p></body></html>"); 
         out.flush(); 
        } 
       } 
      } catch (Exception e) { 
       System.out.println(e.getMessage()); 
      } 
     } 
    } 
} 

Проблемы:

На моем компьютере, если я бегу первый пример, и в моем браузере я типа: «http://192.168.1.xxx», я просто " Здравствуй". Однако на втором, если я попробую одно и то же, это просто не сработает. Но если в командной строке я набираю: telnet 192.168.1.xxx 80, тогда введите GET, он отправит обратно html. Кроме того, если я заменю DataOutputStream на PrintWriter, он даже не отправит его в telnet. Тем не менее, я знаю, что он пытается, потому что программа печатает «0» при каждом соединении, а «1» - каждый раз, когда он что-то печатает.

Вопросы:

  • В чем проблема, которая предотвращает браузер от просмотра HTML?

  • Это связано с самим html, способом настройки моего соединения или DataOutputStream?

  • Как это исправить?

ответ

0

Не используйте порт 80, используйте другой случайный порт более 6000. И если вы не закрыли свою первую программу должным образом, порт 80 все еще используется этой программой.

Я использовал программу Http-сервера, которая похожа на это. Сервер также создает несколько потоков для каждого соединения, поэтому количество клиентов не ограничено 100.

`public class MultiThreadServer реализует Runnable { Socket csocket; static int portno; статический результат строки; MultiThreadServer (Socket csocket) { this.csocket = csocket; }

public static void main(String args[]) 
throws Exception 
{ 
    portno=Integer.parseInt(args[0]); 
    ServerSocket srvsock = new ServerSocket(portno); 
    System.out.println("Listening"); 
    while (true) { 
    Socket sock = srvsock.accept(); 
    System.out.println("Connected"); 
    new Thread(new MultiThreadServer(sock)).start(); 
    } 
    } 
    public void run() 
    { 
    String[] inputs=new String[3]; 
    FileInputStream fis=null; 
    String file=null,status=null,temp=null; 
    try 
    { 
      InputStreamReader ir=new  InputStreamReader(csocket.getInputStream()); 
     BufferedReader br= new BufferedReader(ir); 
     DataOutputStream out = new DataOutputStream(csocket.getOutputStream()); 
     String message=br.readLine(); 
     inputs=message.split(" "); 
     if(inputs[0].equals("GET")) 
      { 
      try{ 
       out.writeBytes("HTTP/1.1 200 OK\r\n"); 
       out.writeBytes("Connection: close\r\n"); 
       out.writeBytes("Content-Type: text/html\r\n\r\n"); 
       out.writeBytes("<!doctype html><html><body><p>hi</p></body> </html>"); 
       } 
       out.flush();      
      fis.close();  
      csocket.close(); 
      } 
      catch(Exception ex) 
      { 
       status="404 File not found"; 
       os.println(status); 

      } 
    }` 
+0

Более 6000 ... это очень случайно, и если бы он был в состоянии работать на 80 из своего компьютера, порт не является проблемой. –

+0

Спасибо за ответ! Новый и улучшенный код отлично работает. Оказывается, проблема в том, что мне нужно закрыть сокет после отправки html, браузер думал, что я все еще отправляю информацию – Evan

Смежные вопросы