#java #serversocket
#java — язык #serversocket #java
Вопрос:
Я пытаюсь вывести привет, когда ввожу enter localhost:9080/?say=привет. Но я понятия не имею, как это сделать
public class MyServer {
public static void main(String args[])throws Exception{
ServerSocket ss=new ServerSocket(9080);
Socket client = ss.accept();
Scanner in =new Scanner(client.getInputStream());
// running infinite loop for getting
// client request
while (true){
String s = in.nextLine();
if (s==null || s.trim().length()==0)
break;
System.out.println(s);
}
PrintWriter out = new PrintWriter(client.getOutputStream(),true);
String document = "<html><body>Salem</body></html>";
String response = "HTTP/1.1 200 OKrn"
"Server: YarServer/2009-09-09rn"
"Content-Type: text/htmlrn"
"Content-Length: " document.length() "rn"
"Connection: closernrn";
out.println(response document);
}
}
Комментарии:
1. Вы можете взглянуть на rest, Spring boot напрямую выдает код plug and play с rest
2. Может быть, вам следует ознакомиться с протоколом передачи гипертекста при попытке реализовать HTTP-сервер с нуля?
3. У Java есть свой собственный
HttpServer
класс. Не используйтеServerSocket
напрямую для реализации HTTP вручную.
Ответ №1:
Конечно, это школьная работа, поэтому я не буду давать вам готовое рабочее решение, просто некоторую подсказку.
Значительно упрощая, протокол HTTP обменивается текстовыми строками между клиентом и сервером. Ваш код уже печатает строки, которые браузер отправляет на ваш сервер; взгляните на первую строку: там говорится
GET /?say=hello HTTP/1.1
«GET» — это «HTTP-метод«, за ним следует путь к запрошенному вами серверному ресурсу (в данном случае просто косая черта) плюс любой параметр запроса (часть после вопросительного знака) и версия протокола.
Чтобы выполнить определенное действие для определенного пути / параметра, запрошенного клиентом, ваш код должен проверить первую строку текста, отправленного браузером (например, вы должны проверить наличие /?say=hello
).
Кроме того, обычно HTTP-сервер не завершает работу после первого запроса, поэтому ваш код должен содержать еще один бесконечный цикл для ожидания другого соединения после обслуживания первого. Ваш код также должен close()
попадать в клиентский сокет после того, как вы отправили ответ в браузер.
Комментарии:
1. В коде приложения клиент отключался после первого запроса, когда он отправлял
connection: close
2. @Ferrybig: клиент ДОЛЖЕН отключиться. Смотрите также serverfault.com/questions/790197 /…