2013-09-25 2 views
0
package WebServer; 
import java.io.*; 
import java.util.*; 
import java.net.*; 

final public class WebServer { 
    ServerSocket server; 
    public void start()throws Exception{ 
     server=new ServerSocket(5000); 
     Socket client; 
     while(true){ 
      client=server.accept(); 
      Thread t1=new Thread(new Handlehttp(client)); 
      t1.start(); 
     } 
    } 
    public static void main(String[] args) { 
     try{ 
     new WebServer().start(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
final class Handlehttp implements Runnable{ 
    Socket s; 
    DataOutputStream ds; 
    BufferedReader br; 
    public Handlehttp(Socket s) throws Exception { 
     this.s=s; 
     ds=new DataOutputStream(s.getOutputStream()); 
     br=new BufferedReader(new InputStreamReader(s.getInputStream())); 
    } 
    private synchronized void httprequest()throws Exception{ 
     String rqln,var; 
     rqln=br.readLine(); 
     System.out.println("Port number : "+s.getPort()); 
     if(rqln!=null) 
     System.out.println(rqln); 
     while((var=br.readLine())!=null){ 
      System.out.println(var); 
     } 
    } 
    private synchronized void httpreponse()throws Exception{ 
     String var,fileName; 
     fileName="D:/file.htm"; 
     FileInputStream fis=new FileInputStream(fileName); 
     int var1; 
     var="HTTP/1.0 200 OK\r\n"; 
     var=var+"Connection: keep-alive\r\n"; 
     var=var+"Server : First\r\n"; 
     var=var+"Content-Type: text/html\r\n"; 
     var=var+"\r\n"; 
     ds.writeBytes(var); 
     while((var1=fis.read())!=-1){ 
     ds.write(var1); 
     } 
    } 

    @Override 
    public void run() { 
     try{ 
     httprequest(); 
     httpreponse(); 
     //s.close(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Я получаю ошибку Оправы программного обеспечения на ds.writeBytes не происходят никаких других исключений, я предполагаю, что сокет closed.I`m в состоянии увидеть HTTP запрос от браузера, но не имею до сих пор не повезли печать любой информации сортировать по браузерОправа Ошибка записи

КСТАТИ я сделал предыдущий вопрос относительно многопоточного сервера, но так как предыдущие проблемы были решены (может быть решены) начали новую ошибки вопрос обозревает розетку

исключения я получаю

Port number : 10225 
GET /file.htm HTTP/1.1 
Host: localhost:5000 
Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 
DNT: 1 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 

Port number : 10226 

java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:132) 
    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:276) 
    at WebServer.Handlehttp.httpreponse(WebServer.java:57) 
    at WebServer.Handlehttp.run(WebServer.java:82) 
    at java.lang.Thread.run(Thread.java:722) 
+1

, пожалуйста, отправьте код клиента. – Jiji

+0

Каков результат, который вы получаете при запуске приложения и сделаете запрос http? – ahmedalkaff

+0

@Jiji Сервер должен отправить HTTP-ответ для запроса от браузера – AAB

ответ

1

readLine() возвращает значение null, когда сверстник закрыл соединение. Поэтому вы не можете после этого писать (за исключением случаев остановки, чего не происходит в HTTP). Если вы используете HTTP, вам нужно прочитать HTTP RFC, чтобы узнать, как это сделать правильно. Догадки не достаточно хороши. Обратите внимание, что ваш запрос был HTTP 1.1, и что он содержит заголовок Connection: keep-alive и заголовок Content-Length, что означает, что после заголовков не было тела запроса.

+0

Почему readLine возвращает null? httpresonse вызывается один раз внутри метода run после того, как он заканчивает выполнение, почему readLine снова будет считываться из потока? Я вижу, что я использовал HTTP 1.0, но это был отчаянный ход с моей стороны, поскольку я уже потратил довольно много времени на то, чтобы сделать этот код работой, не могли бы вы объяснить мне, как работает поток? Я просто изучаю Java. Я думал, что br.readLine() читается из потока и после того, как (конец достигнут) ничего не осталось, чтобы прочитать возвращает null и завершает цикл while, это неправильный способ завершения readLine() – AAB

+0

Какая часть «когда партнер закрыл соединение», Разве вы не понимаете? – EJP

+0

, так что я должен использовать br.close() после завершения операции чтения? или я безнадежно ошибаюсь? :( – AAB

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