java socket http服务器,一个带Java / Socket的简单Http服务器?

I am currently creating a small HTTP server that returns a static page

Hello!

...

I tried with sockets with Java:

public static void main(String[] args) throws Exception {

// création de la socket

int port = 1989;

ServerSocket serverSocket = new ServerSocket(port);

System.err.println("Serveur lancé sur le port : " + port);

// repeatedly wait for connections, and process

while (true) {

// on reste bloqué sur l'attente d'une demande client

Socket clientSocket = serverSocket.accept();

System.err.println("Nouveau client connecté");

// on ouvre un flux de converation

BufferedReader in = new BufferedReader(

new InputStreamReader(clientSocket.getInputStream())

);

PrintWriter out = new PrintWriter(

new BufferedWriter(

new OutputStreamWriter(clientSocket.getOutputStream())),

true);

// chaque fois qu'une donnée est lue sur le réseau on la renvoi sur le flux d'écriture.

// la donnée lue est donc retournée exactement au même client.

String s;

while ((s = in.readLine()) != null) {

System.out.println(s);

out.write("HTTP/1.0 200 OK\r\n");

out.write("Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n");

out.write("Server: Apache/0.8.4\r\n");

out.write("Content-Type: text/html\r\n");

out.write("Content-Length: 59\r\n");

out.write("Expires: Sat, 01 Jan 2000 00:59:59 GMT\r\n");

out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");

out.write("\r\n");

out.write("

Exemple");

out.write("

Ceci est une page d'exemple.

");

}

// on ferme les flux.

System.err.println("Connexion avec le client terminée");

out.close();

in.close();

clientSocket.close();

}

}

this code does not contain any errors and I got a response from the browser like this:

GET / HTTP/1.1

Host: localhost:1989

Connection: keep-alive

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5 Comodo_Dragon/19.0.3.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding: gzip,deflate,sdch

Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

But my problem is that I get no page at the Browser?

Any help please?

PS: I already read this article: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol , (im sorry for the french language...)

解决方案

In addition to the \r\n after every request header line, you have to send an empty line after the header. Example:

out.write("HTTP/1.0 200 OK\r\n");

// Header...

out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");

out.write("\r\n"); // The content starts afters this empty line

out.write("

Hello!");

// Content...

I corrected your code so that it works (but it is still not perfect, you should handle every request in a seperate thread, e.g. with java.util.concurrent.ThreadPoolExecutor):

public static void main(String[] args) throws Exception {

// création de la socket

int port = 1989;

ServerSocket serverSocket = new ServerSocket(port);

System.err.println("Serveur lancé sur le port : " + port);

// repeatedly wait for connections, and process

while (true) {

// on reste bloqué sur l'attente d'une demande client

Socket clientSocket = serverSocket.accept();

System.err.println("Nouveau client connecté");

// on ouvre un flux de converation

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

// chaque fois qu'une donnée est lue sur le réseau on la renvoi sur

// le flux d'écriture.

// la donnée lue est donc retournée exactement au même client.

String s;

while ((s = in.readLine()) != null) {

System.out.println(s);

if (s.isEmpty()) {

break;

}

}

out.write("HTTP/1.0 200 OK\r\n");

out.write("Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n");

out.write("Server: Apache/0.8.4\r\n");

out.write("Content-Type: text/html\r\n");

out.write("Content-Length: 59\r\n");

out.write("Expires: Sat, 01 Jan 2000 00:59:59 GMT\r\n");

out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");

out.write("\r\n");

out.write("

Exemple");

out.write("

Ceci est une page d'exemple.

");

// on ferme les flux.

System.err.println("Connexion avec le client terminée");

out.close();

in.close();

clientSocket.close();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值