2012-02-12 2 views
0

Несколько часов назад я начал изучать связь java-сокета. Теперь я пытаюсь сделать серверное приложение whitch должно вернуть мне данные в webbrowser. Мой код:Ошибка простого сервера Java

try{ 
    ServerSocket socket = new ServerSocket(80); 
    Socket response = socket.accept(); 
    String lol = "<html>hi</html>"; 
    OutputStream str = response.getOutputStream(); 
    str.write(lol.getBytes("US-ASCII")); 
    str.flush(); 
    response.close(); 
    System.out.println("LOL works!"); 
    }catch(IOException ex) 
    { 
     System.out.println(ex.toString()); 
    } 
} 

У меня нет ошибки в серверном приложении, сообщение «LOL работает !!!» печатает в консоли, но в WebBrowser я получаю эту ошибку:

My error.

ли anobody знать, как отремонтировать его и получить текст «привет» в WebBrowser? Благодарю.

EDIT: Я попытался добавить его в telnet. Это результат: Telnet result

+2

Вы прослушивает порт 80, но подключение через HTTPS который по умолчанию соответствует порту 443. Это одна проблема, наверняка? – rodion

+0

Я работаю над 80. Это первое изображение, которое я нашел в google. – user35443

ответ

2

Вы не можете просто отправить сырые данные в браузер и ожидать, что справиться с этим - вы должны следовать HTTP (протокол), который описан в RFC1945.

В частности, вам необходимо отправить несколько заголовков, за которыми следует новая строка, как описано в разделе 4.1 RFC1945.

try{ 
    ServerSocket socket = new ServerSocket(80); 
    Socket response = socket.accept(); 
    String lol = "<html>hi</html>"; 
    writer = new PrintStream(response.getOutputStream()); 
    writer.println("HTTP/1.1 200 OK"); 
    writer.println("Content-Type: text/html"); 
    writer.println(); 
    writer.println(lol); 
    writer.flush(); 
    response.close(); 
    System.out.println("LOL works!"); 
    }catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

Обратите внимание, что я также завернутые свой OutputStream в PrintStream, так как это намного проще, чем обработки OutputStream вручную.

+0

Я пробовал, но он все еще не работает ... – user35443

+1

Использование '\ n' в качестве разрыва строки там не работает. Протокол HTTP указывает, что необходимо использовать '\ r \ n'. Не забывайте те, которые были написаны после того, как тело ответа было написано. – fivedigit

+0

Ошибка 101 (net :: ERR_CONNECTION_RESET): соединение было сброшено – user35443

0

Веб-браузер взаимодействует с веб-сервером, используя HTTP protocol. Ваш сервер должен ответить на запрос браузера в соответствии с этим протоколом, если вы хотите, чтобы браузер отображал страницу правильно.

0

Похож на проблему с Chrome. Возможно this one?

Попробуйте поиграть с настройками IPv6.

0

Помимо отправки правильного ответа, как указал Кристиан Антонсен, проблема в том, что вы действительно не ожидаете и не читаете запрос, прежде чем отвечать. Вероятно, это не должно быть проблемой из-за буферизации, но даже тогда вполне вероятно, что ваш сервер просто «слишком быстр», отправив ответ и закрыв сокет до того, как у Chrome появится возможность отправить запрос, поэтому запуск «соединения» сбросить ", что он сообщает.

Попробуйте реализовать сервер, который является чуть более полным. Вот простой пример:

public void readRequest(Socket client) throws IOException { 
    Reader raw = new InputStreamReader(client.getInputStream(), "US-ASCII"); 
    BufferedReader reader = new BufferedReader(raw); 
    while(true) { 
     String line = reader.readLine().trim(); 
     if(line.equals("")) 
      break; 
    } 
} 

public void writeResponse(Socket client) throws IOException { 
    String lol = "<html>hi</html>"; 
    PrintStream writer = new PrintStream(client.getOutputStream()); 
    writer.println("HTTP/1.1 200 OK"); 
    writer.println("Content-Type: text/html"); 
    writer.println(); 
    writer.println(lol); 
    writer.flush(); 
} 

public void serveClient(Socket client) throws IOException { 
    try { 
     readRequest(client); 
     writeResponse(client); 
     System.out.println("LOL works!"); 
    } finally { 
     client.close() 
    } 
} 

public void serve() { 
    try{ 
     ServerSocket socket = new ServerSocket(80); 
     while(true) { 
      Socket client = socket.accept(); 
      serveClient(client); 
     } 
    }catch(IOException e) { 
     e.printStackTrace(); 
    } 
} 

(Обратите внимание, что я не пробовал код или что-нибудь, так что нет никакой гарантии, что он компилируется как есть.)

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