有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Javasocket发送HTTP响应时出现问题

我一直在尝试编写一个简单的web服务器的开始,但似乎无法获得发送的响应。我尝试了所有可以想象的输出流类型,但似乎没有任何效果。我不知所措。下面是我正在使用的两个类,对于一些无关的代码感到抱歉:

package edu.xsi.webserver;

import java.io.IOException;
import java.net.ServerSocket;


public class WebServer {

int port;
ServerSocket server;

public WebServer(int port) throws IOException{

    this.port = port;
    this.server = new ServerSocket(port);
    Thread t = new Thread(new ServerExec());
    t.start();

}

public class ServerExec implements Runnable {

    public void run(){

        int i = 0;
        while (true) {

            try {
                new WebSession(server.accept(), i++);
                System.out.println("Should print before session");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


}

public static void main(String[] args) {

    try {
        WebServer webServer = new WebServer(8888);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

这是处理响应的会话类

package edu.xsi.webserver;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class WebSession implements Runnable {

Socket client;
int num;

public WebSession(Socket client, int num) {

    this.num = num;
    this.client = client;
    Thread t = new Thread(this);
    t.start();
}


public void run() {

    Scanner s = null;
    DataOutputStream out = null;

    try {

        s = new Scanner(client.getInputStream());
        out = new DataOutputStream(client.getOutputStream());

        //Get all input from header
        while (s.hasNextLine()) {
            System.out.println(s.nextLine());
        }
        out.writeBytes("HTTP/1.1 200 OK\r\n");
        out.writeBytes("Content-Type: text/html\r\n\r\n");
        out.writeBytes("<html><head></head><body><h1>Hello</h1></body></html>");

        s.close();
        out.flush();
        out.close();

    } catch(IOException ioe) {

        ioe.printStackTrace();
    }

}

}


共 (4) 个答案

  1. # 1 楼答案

    关闭扫描仪将关闭底层输入流,从而关闭套接字。别关上它。关闭输出流也会关闭套接字。您不需要两者都使用,并且应该关闭输出流/写入器,而不是输入流,以便刷新它

  2. # 2 楼答案

    试着过一下日期

     String res = "HTTP/1.0 200 OK\n"
             + "Server: HTTP server/0.1\n";
             + "Date: "+format.format(new java.util.Date())+"\n"; 
       + "Content-type: text/html; charset=UTF-8\n"; 
             + "Content-Length: 38\n\n";
             + "<html><body>OK</body></html>";
    out.write(res.getBytes());
    out.flush();
    
    private SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:Ss z");
    
  3. # 3 楼答案

    以下代码将解决您的问题:

    package com.cs.sajal;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class TestCls {
    
        public static void main(String[] args) {
            boolean flag = false;
    
            try {
                ServerSocket ss = new ServerSocket(8080);
                if (ss.isBound()) {
                    while (flag = true) {
                        final Socket s = ss.accept();
    
    
    
                        Thread t1=new Thread(new Runnable (){String line = null;public void run(){try{ InputStream is = s.getInputStream();
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(is));
    
                        while ((line = br.readLine()) != null) {
                            System.out.println(line);
                        }
                        }
                        catch(Exception e)
                        {
                            e.printStackTrace();
                        }
                        }});
    
                        Thread t2=new Thread(new Runnable (){String line = null;public void run(){try{ OutputStream os = s.getOutputStream();
                        Scanner sc=new Scanner(System.in);
                        String inp=null;
                        String t="HTTP/1.1 200 OK\r\n";
                        byte[]s=t.getBytes("UTF-8");
                        os.write(s);
    
                        t="Content-Length: 788\r\n";
                        s=t.getBytes("UTF-8");
                        os.write(s);
                        t="Content-Type: text/html\r\n\r\n";
                        s=t.getBytes("UTF-8");
                        os.write(s);
    
    
                        t="\r\n\r\n<html><body><h1>this is output</h1><table cellpading=5 border=5><tr><td>name</td><td>age></td><td>height</td></tr></table></body></html>\r\n\r\n";
                        s=t.getBytes("UTF-8");
                        os.write(s);
                        t="Connection: Closed";
                        s=t.getBytes("UTF-8");
                        os.write(s);
    
                        os.flush();
                        }
                        catch(Exception e)
                        {
                            e.printStackTrace();
                        }
                        }});
                        t1.start();
                        t2.start();t1.join();
                        t2.join();
    
    
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
  4. # 4 楼答案

    我一直在为一个非常类似的问题拼命挣扎

    我发现我的问题是如此的微不足道,以至于我头撞了一段时间

    基本上,在我的输入while循环中,我检查了一个空行,但我忘记了检查一个空行(随后中断)

    不保证对你也一样,但这是我的一分钱:

    in = session.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line = null;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
        // this seems to be the key for me! 
        // somehow I never get out of this loop if I don't 
        // check for an empty line...
        if (line.isEmpty()) {
            break;
        }
    }
    out = new BufferedWriter(
        new OutputStreamWriter(
            new BufferedOutputStream(session.getOutputStream()), "UTF-8")
    );
    out.write(OUTPUT_HEADERS + OUTPUT.length() + OUTPUT_END_OF_HEADERS + OUTPUT);
    out.flush();
    out.close();
    session.close();
    

    我的常数是:

    private static final String OUTPUT = "<html><head><title>Example</title></head><body><p>Worked!!!</p></body></html>";
    private static final String OUTPUT_HEADERS = "HTTP/1.1 200 OK\r\n" +
        "Content-Type: text/html\r\n" + 
        "Content-Length: ";
    private static final String OUTPUT_END_OF_HEADERS = "\r\n\r\n";
    

    我的“session”变量是一个Socket对象