Mar*_*lsi 25 java sockets http
我目前正在创建一个返回静态页面的小型HTTP服务器<p>Hello!</p>...我尝试使用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("<TITLE>Exemple</TITLE>");
out.write("<P>Ceci est une page d'exemple.</P>");
}
// on ferme les flux.
System.err.println("Connexion avec le client terminée");
out.close();
in.close();
clientSocket.close();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码不包含任何错误,我从浏览器得到如下响应:
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
Run Code Online (Sandbox Code Playgroud)
但我的问题是我在浏览器中没有页面?有什么帮助吗?
PS:我已经读过这篇文章:http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol,(对不起法语...)
Joe*_*ard 31
除了每个请求标题行后的\ r \n,您必须在标题后面发送一个空行.例:
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("<TITLE>Hello!</TITLE>");
// Content...
Run Code Online (Sandbox Code Playgroud)
我纠正了你的代码以便它可以工作(但它仍然不完美,你应该在一个单独的线程中处理每个请求,例如使用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("<TITLE>Exemple</TITLE>");
out.write("<P>Ceci est une page d'exemple.</P>");
// on ferme les flux.
System.err.println("Connexion avec le client terminée");
out.close();
in.close();
clientSocket.close();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67035 次 |
| 最近记录: |