2013-03-06 2 views
4

Я пытаюсь реализовать многопоточный веб-сервер Java.многопоточный веб-сервер 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-адреса, и будет строиться, как только это будет разрешено.

+0

Я думаю, что вы должны вернуть ответ в формате HTTP – Behnil

+0

Как это сделать? любую идею или ссылки, о которых я могу прочитать? – user2114721

ответ

2

Вы никогда не пишете заголовки HTTP.

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.

1

Если вы хотите подключиться к серверу с помощью браузера, он должен вернуть HTTP-ответ с заголовками. Here - простой пример HTTP-сервера. Или лучше посмотрите на вопрос this.

Смежные вопросы