Цель: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?
Как это исправить?
Более 6000 ... это очень случайно, и если бы он был в состоянии работать на 80 из своего компьютера, порт не является проблемой. –
Спасибо за ответ! Новый и улучшенный код отлично работает. Оказывается, проблема в том, что мне нужно закрыть сокет после отправки html, браузер думал, что я все еще отправляю информацию – Evan