2016-08-04 8 views
0

в основном html-файл, который запрашивает изображение с сервера, и я создаю сервер, который выполняет материал ответа, но когда html-запрос для изображения сервер отправляет изображение полностью но клиентский браузер остается при загрузке изображения и говорит «передача данных с сервера», у меня были исследования по всему Интернету, и я обнаружил, что могу сделать это, только закрыв соединение, но это не сработало для меня.как отправить EOF через сокет в java

Вот код для моего сервера построить в Java:

package lesson1; 

import java.io.*; 
import java.net.*; 
import java.lang.Exception; 

public class SecClass{ 

BufferedReader fd; 
String link = null, HTMLData = null, WEBROOT = "D:/PDT1"; 
String ptr = null, directory = null, 
     GET_HEAD_POST = null, Protocol = null; 
ServerSocket SRVSOCK; 
Socket SOCK; 
DataOutputStream dOut; 
DataInputStream dInput; 
InputStreamReader IR; 


public static void main(String[] args) throws Exception 
{ 
    SecClass SERVER = new SecClass(); 
    SERVER.run(); 
} 

public void run() throws Exception 
{ 
    SRVSOCK = new ServerSocket(80); 
    while(true){ 
     SOCK = SRVSOCK.accept(); 
     new Thread(new SocketThread(SOCK)).start(); 
    } 
} 

public class SocketThread implements Runnable { 

    @SuppressWarnings("unused") 
    private Socket socket; 

    public SocketThread(Socket socket) { 
     this.socket = socket; 
    } 

    @Override 
    public void run() { 
     try{ 
      dOut = new DataOutputStream(SOCK.getOutputStream()); 
     }catch(Exception ie){ 
      System.out.println("Cound'nt create dOut"); 
     } 

     try{ 
      IR = new InputStreamReader(SOCK.getInputStream()); 
     }catch(Exception ie){ 
      System.out.println("Cound'nt create IR"); 
     } 


     BufferedReader BR = new BufferedReader(IR); 
     String MESSAGE = null; 
     System.out.println("Received Request!"); 
     try{ 
      MESSAGE = BR.readLine(); 

     }catch(Exception ie){ 
      System.out.println("Cound'nt Receive Message"); 
     } 
     System.out.println(MESSAGE); 

     if(MESSAGE != null && MESSAGE.contains("HTTP/")){ 
      Protocol = MESSAGE.substring(MESSAGE.length()-8); 
      System.out.println("Request protocol is " + Protocol); 
     } else { 
      System.out.println("It's a Not HTTP request"); 
     } 

     if(MESSAGE != null && MESSAGE.contains("GET ")){ 
      GET_HEAD_POST = "GET "; 
      System.out.println("Reqest is GET"); 
      ptr = MESSAGE.substring(4); 
      directory = ptr.substring(0,ptr.length()-9); 
      link = ptr.substring(ptr.length() - 10); 
      System.out.println(link); 

     } else if(MESSAGE != null && MESSAGE.contains("HEAD ")){ 
      System.out.println("Request is HEAD"); 
      GET_HEAD_POST = "HEAD "; 
      ptr = MESSAGE.substring(5); 
      directory = ptr.substring(0,ptr.length()-9); 
      link = ptr.substring(ptr.length() - 10); 
     } else if(MESSAGE != null && MESSAGE.contains("POST ")){ 
      System.out.println("Request is POST"); 

     } else { 
      System.out.println("Cound'nt verify request"); 
      try{ 
       SRVSOCK.close(); 
      }catch(Exception ie){ 
       System.out.println("Could not close SRVSOCK"); 
      } 
      try{ 
       SOCK.close(); 
      }catch(Exception ie){ 
       System.out.println("Could not close SOCK"); 
      } 

     } 

     if(MESSAGE == null) 
     { 
      System.out.println("Unknown request"); 
      try{ 
       SOCK.close(); 
      }catch(Exception ie){ 
       System.out.println("Could not close SOCK"); 
      } 

     } else { 
      if((link.charAt(0)) == '/' && link != null){ 
       link = WEBROOT + directory + "index.html"; 
       try{ 

        OpenFile(); 
        dOut.close(); 
        SOCK.close(); 
        System.out.println("Came out of Openfile Func"); 

       }catch(Exception ie){ 
        System.out.println("Could not Call for OpenFile Function"); 
       } 
       try{ 
        MESSAGE = BR.readLine(); 
       }catch(Exception ie){ 
        System.out.println("Could not Receive message"); 
       } 

       System.out.println(MESSAGE); 

      } else { 
       System.out.println("User Requested for a file"); 
       System.out.println(directory); 

       link = WEBROOT + directory; 
       try{ 
        OpenFile(); 
        dOut.close(); 
        SOCK.close(); 
       }catch(Exception ie){ 
        System.out.println("Could not Call for OpenFile Function"); 
       } 
      } 

     } 
    } 
} 
public void OpenFile() throws Exception{ 
    try (BufferedReader br = new BufferedReader(new FileReader(link))) { 
     String line; 
     System.out.println("Request Link is: " + link); 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
      dOut.writeBytes(line); 
     } 
     dOut.flush(); 
     dOut.close(); 
     SOCK.close(); 
    } catch(Exception e){ 
     System.out.println(link); 
     dOut.writeBytes("<html><h1>404 File Not Found</h1></html>"); 
     System.out.println("File Does not Exist"); 

    } 
} 
} 

и вот мой HTML код:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <title>hello</title> 
</head> 
<body> 
    <header> 
     <div class="HeaderBox"> 
      <img src="logo.png" alt="image" class="logoBox"/> 
     </div> 
    </header> 
</body> 
</html> 

, как вы можете видеть, я пытался дважды, чтобы закрыть соединение на сервер, когда изображение полностью переносится, но в моем браузере он застревает в загрузке, а внизу он говорит, что передача данных из 127.0.0.1

+0

Вы также можете публиковать сообщения в журнале? –

+0

да «получен запрос GET /logo.png HTTP/1.1 протокол запроса является HTTP/1.1 Reqest является GET г HTTP/1.1 пользователя запрошено для файла /logo.png запрос ссылка: D:/PDT1/logo.png " и есть бит во время чтения строки за строкой и вывода его –

+0

вы можете перемещать все поля, кроме ServerSocket SRVSOCK; Socket SOCK; от класса SecClass до класса SocketThread.Теперь попробуйте проверить и сообщить статус –

ответ

1

Прежде всего переместите все поля, кроме ServerSocket SRVSO CK; от класса SecClass до класса SocketThread. Сделайте Socket SOCK; локальная ссылка в методе run(). Причина, заключающаяся в том, что ваш код использует многопоточность. Поэтому переместите их в класс SocketThread. Также переместите OpenFile() для более чистого подхода.

Вы используете одну и ту же ссылку SOCK для разных запросов на поток. А также при закрытии вы ссылаетесь на поле SOCK. Это является причиной ошибочного поведения. Что может и в основном происходит, когда один поток закрывает сокет другого потока из-за неправильной ссылки SOCK.

Что вам нужно сделать, это:

public void run() throws Exception 
{ 
SRVSOCK = new ServerSocket(8088); 
while(true){ 
    Socket SOCK; 
    SOCK = SRVSOCK.accept(); 
    new Thread(new SocketThread(SOCK)).start(); 
} 
} 

И в SocketThread не ссылаются с помощью носка. Например. SOCK.getInputStream(). измените на socket.getInputStream(), который использует поле SocketThread. Аналогичным образом меняйте других.

А почему изображение не получает визуализацию: Change (OpenFile) по адресу:

public void OpenFile() throws Exception{ 
    try (FileInputStream br = new FileInputStream (link)) { 
     System.out.println("Request Link is: " + link); 
     int i; 
     while ((i = br.read()) > -1) 
      dOut.write(i); 

      dOut.flush(); 
      dOut.close(); 
      SOCK.close(); 
     } catch(Exception e){ 
      System.out.println(link); 
      dOut.writeBytes("<html><h1>404 File Not Found</h1></html>"); 
      System.out.println("File Does not Exist"); 

     } 
} 

Изменения в основном для чтения файла в виде байт и записать его в виде байт в поток ответа. Принимая во внимание то, что происходило в вашем случае, вы читали его как строку.

Вы можете проверить link на разницу между чтением файла с использованием считывателя и входного потока.

Работы для меня. Дайте мне знать, если это сработает для вас.

+0

Да, он работал просто отлично, еще одна вещь почему он просто работает на firefox, но в chrome выводит запрос на получение запроса и ничего больше. и спасибо за помощь –

+0

вы можете принять и перенести ответ. –

+0

извините, я могу проголосовать за мою репутацию еще не достиг 15, и, пожалуйста, прочитайте мой комментарий вверх по их agian –

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