java - 多线程 Java Web 服务器

标签 java multithreading webserver

我正在尝试实现多线程 java 网络服务器。

这是我的主要内容:

import java.net.*;

public class Main {
    public static void main(String argv[]) throws Exception{

        ServerSocket welcomeSocket = new ServerSocket(6790);
        while(true){
            System.out.println("Waiting...");
            Socket cSock = welcomeSocket.accept();
            System.out.println("Accepted connection : " + cSock);

            Server a = new Server(cSock);
            a.start();


        }
    }
}

这是我的线程类:

import java.io.*;
import java.net.*;
import java.util.Scanner;


public class Server extends Thread{
    Socket cSock;

    Server(Socket cSock){   //constructor
        this.cSock = cSock;
    }

    public void run(){
        try{
            String request;
            Scanner inFromClient = new Scanner(cSock.getInputStream());
            DataOutputStream outToClient = new DataOutputStream(cSock.getOutputStream());
            request = inFromClient.nextLine();
            System.out.println("Received: "+request);

            //trimming URL to extract file name
            String reqMeth = request.substring(0, 3);
            String reqURL = request.substring(5, (request.lastIndexOf("HTTP/1.1")));
            String reqProto = request.substring(request.indexOf("HTTP/1.1"));
            System.out.println("Request Method:\t" +reqMeth +"\nRequest URL:\t" +reqURL+ "\nRequest Protocol: " +reqProto);

            //passing file name to open
            File localFile = new File(reqURL.trim());
            byte [] mybytearray  = new byte [(int)localFile.length()];
            FileInputStream fis = new FileInputStream(localFile);
            BufferedInputStream bis = new BufferedInputStream(fis);
            bis.read(mybytearray,0,mybytearray.length);

            //sending file to stream
            System.out.println("Sending...");           
            outToClient.write(mybytearray,0,mybytearray.length);
            outToClient.flush();
            outToClient.close();

        }catch(Exception e){
            System.out.println(e);
        }
    }
}

按照逻辑,服务器收到每个请求,都会创建一个新线程。每个线程都与一个特定的请求相关联。 我的问题是当我请求一个文件(例如 index.html)时,服务器收到请求,但文件没有加载,浏览器继续加载。

我发现每个线程都已启动但没有完成。

这是一个输出:

Waiting...
Accepted connection : Socket[addr=/192.168.0.10,port=58957,localport=6790]
Waiting...
Accepted connection : Socket[addr=/192.168.0.10,port=58958,localport=6790]
Waiting...
Received: GET /html/index.html HTTP/1.1
Request Method: GET
Request URL:    html/index.html 
Request Protocol: HTTP/1.1
Accepted connection : Socket[addr=/192.168.0.10,port=59093,localport=6790]
Waiting...
Received: GET /index.html HTTP/1.1
Request Method: GET
Request URL:    index.html 
Request Protocol: HTTP/1.1

我做错了什么?还有更好的方法吗?请注意,我只做了一个线程来测试来自一个 IP 的请求,并且将在解决此问题后继续构建。

最佳答案

您永远不会编写 HTTP header 。

outToClient.write("HTTP/1.0 200 OK\r\n");
outToClient.write("Connection: Close\r\n");
outToClient.write("\r\n");
outToClient.write(mybytearray,0,mybytearray.length);

如果您要实现自己的服务器,您应该阅读 RFC 2616 .

关于java - 多线程 Java Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15248430/

相关文章:

multithreading - 用于在 Julia 中读取 CSV 文件的多线程

c# - 您能想到 .NET 中具有同步上下文的事件模式吗?

ios - 适用于iOS应用的嵌入式服务器是否可以通过wifi向浏览器提供日志记录?

重新加载页面时,asp.net session 丢失(ispostback = false)

web-applications - 如何告诉 Hunchentoot 在哪里可以找到要提供的静态网页?

java - 根据行中包含的数字对文件中的行进行排序

java - 类型转换比较器为子类工作

java - Hibernate 模板关闭事务

java - 如何在 Java 中处理时间

java - 从其他线程更新 AtomicInteger