-1

我正在写一个网络客户端。我有以下代码。

public class Connection extends Thread{
public final static int PORT = 1337;
private ServerSocket svrSocket = null;
private Socket con  =  null;
public Connection(){

    try{
        svrSocket = new ServerSocket(PORT);
        System.out.println("Conected to: " + PORT);

    }catch(IOException ex)
    {
       System.err.println(ex);
       System.out.println("Unable to attach to port");
   }

}

public void run(){

while(true)
{

        try{
            con = svrSocket.accept();//on this part the program stops
            System.out.println("Client request accepted");
            PrintWriter out = new PrintWriter(con.getOutputStream());
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            out.println("GET /<index.html> HTTP/1.1");

            out.println("***CLOSE***");
            System.out.println(in.readLine());
           /*
            String s;

            while((s = in.readLine()) != null)
            {
                System.out.println(s);
            }*/
            out.flush();
            out.close();
            in.close();
            con.close();

            System.out.println("all closed");
    }
        catch(IOException ex)
    {
        ex.printStackTrace();

    }



}
}

}

run 方法将在后面使用。我拥有的是一个名为index.html. 该文件与 java 代码在同一个文件中。我试图对请求做的是发送 HTML 文件。但是,如果我在 Web 浏览器上运行该程序,则会localhost:1337显示以下内容。

GET /<index.html> HTTP/1.1
***CLOSE***

这不应该显示。应显示HTML 代码结果的页面index.html

索引.html 代码:

<html>
 <head>
  <title>       </title>

 </head>
 <body bgcolor = "#ffffcc" text = "#000000">
  <h1>Hello</h1>
  <p>This is a simple web page</p>
 </body>
</html>

如何让这个 html 页面显示在浏览器中?

谢谢

4

2 回答 2

0

你混淆了几件事。首先:您正在编写的是服务器,而不是客户端。

第二:您没有遵循 HTT 协议。

该行GET /<index.html> HTTP/1.1(应该是错误GET /index.html HTTP/1.1的)是客户端发送的请求(如网络浏览器)。相反,它是您的服务器发送的。

快速解决方案:

不要发送此静态文本(带有 的行GET和带有 的行***CLOSE***),而是读取index.html文件的内容并将其打印到您的out流中。

编辑:这是http数据流的快速概述:

  1. 客户端(例如浏览器)连接到服务器
  2. 客户端发送它的请求,比如

    GET /theFileIWant.html HTTP/1.1\r\n
    主机: 本地主机\r\n
    \r\n
    
  3. 此时,客户端通常会停止发送任何内容并等待服务器响应。这就是所谓的“请求/响应”模型。

  4. 服务器读取请求数据并找出它必须做什么。
  5. 输出(在这种情况下:文件的内容)被发送到客户端,前面是 HTTP 响应标头。
  6. 连接可以保持打开或关闭,具体取决于客户端请求和服务器响应的 HTTP 标头。
于 2013-07-29T15:34:44.707 回答
0

t 似乎您的代码一切正常,您似乎需要从输入流中读取 HTTP 标头,以便获取请求的文件名,然后使用 Socket 输出流写入来自文件的响应。

OutputStream output = con.getOutputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String fileName = readHeader(in);
String baseDir = System.getProperty("my.base.dir", "/home/myname/httpserver");
boolean exist = true;
InputStream fileIn = null;
try {
   File requestedFile = new File(baseDir, fileName);
   fileIn = new FileInputStream(requestedFile);
} catch(Exception e){
    exist = false;
}

String server = "Java Http Server";
String statusLine = null;
String typeLine = null;
String body = null;
String lengthLine = "error";

if (exist) {
   statusLine = "HTTP/1.0 200 OK" + "\r\n";
   //get content type by extension
   typeLine = "Content-type: html/text  \r\n";
   lengthLine = "Content-Length: " + (new Integer(fileIn.available())).toString() + "\r\n";
} else {
  statusLine = "HTTP/1.0 404 Not Found" + CRLF;
  typeLine = "text/html";
  body = "<HTML>" + "<HEAD><TITLE>404</TITLE></HEAD>" + "<BODY>404 Not Found"+"</BODY></HTML>";
}

output.write(statusLine.getBytes());
output.write(server.getBytes());
output.write(typeLine.getBytes());
output.write(lengthLine.getBytes());

output.write("\r\n".getBytes());

if (exist) {
   byte[] buffer = new byte[1024];
   int bytes = 0;

   while ((bytes = fileIn.read(buffer)) != -1) {
     output.write(buffer, 0, bytes);
   }
} else {
   output.write(body.getBytes());
}
//close sreams
于 2013-07-29T16:01:11.157 回答