Чтение Http Получает запрос от inputstream и отправку его хозяину. использование гнезд

у меня есть это назначение, где я, как предполагается, пишу прокси-сервер, который использует явские гнезда, чтобы обращаться, получают запросы от клиента. Я теперь застреваю и смотрел на всем протяжении Google, чтобы найти ответ, но без успеха.

Решение Christoffers, которому помогают мой с моей первой проблемой. Теперь, когда я обновил код, это - то, что я использую.

Проблема состоит в том, что это только загружает части большинства веб-страниц, прежде чем это застрянет при отправке назад пакетов к петле клиента. В данный момент я не могу объяснить, почему это ведет себя способ, которым это.

public class MyProxyServer {  
    //Set the portnumber to open socket on
    public static final int portNumber = 5555;  

    public static void main(String[] args){  
//create and start the proxy
MyProxyServer myProxyServer = new MyProxyServer();  
myProxyServer.start();  
}  
public void start(){  
System.out.println("Starting MyProxyServer ...");  
try {  
    //create the socket 
    ServerSocket serverSocket = new ServerSocket(MyProxyServer.portNumber);  

    while(true)
    {    
        //wait for a client to connect
        Socket clientSocket = serverSocket.accept();  

        //create a reader to read the instream
        BufferedReader inreader = new BufferedReader( new InputStreamReader(clientSocket.getInputStream(), "ISO-8859-1"));  

        //string builder for preformance when we loop over the inputstream and read lines
        StringBuilder builder = new StringBuilder();
        String host = "";


        for (String buffer; (buffer = inreader.readLine()) != null;) {
        if (buffer.isEmpty()) break;
        builder.append(buffer.replaceAll("keep-alive", "close"));
        if(buffer.contains("Host"))
            {
            //parse the host
            host = buffer.replaceAll("Host: ", "");
            }
        System.out.println(buffer);
        }


        String req = builder.toString();
        System.out.println("finshed reading \n" + req);
        System.out.println("host: " + host);


        //new socket to send the information over
        Socket s = new Socket(InetAddress.getByName(host), 80);

        //printwriter to send text over the output stream
        PrintWriter pw = new PrintWriter(s.getOutputStream()); 

        //send the request from the client
        pw.println(req+"\r\n");
        pw.flush();

        //create inputstream to receive the web page from the host
        BufferedInputStream in = new BufferedInputStream(s.getInputStream());

        //create outputstream to send the web page to the client
        BufferedOutputStream outbuffer = new BufferedOutputStream(clientSocket.getOutputStream());

        byte[] bytebuffer = new byte[1024];
        int bytesread;

        //send the response back to the client
        while((bytesread = in.read(bytebuffer)) != -1) {
        System.out.println(bytesread);
        outbuffer.write(bytebuffer,0, bytesread);
        outbuffer.flush();
        }
        System.out.println("done sending");

        //close the streams
        inreader.close();
        s.close();
        pw.close();
        outbuffer.close();
        in.close();
    }


} catch (IOException e) {  
    e.printStackTrace();
}  catch(RuntimeException e){
    e.printStackTrace();
}
}  

}

Если кто-либо мог бы объяснить мне, почему я не могу получить его работающий правильно и как решить его, я был бы очень благодарен!

Заранее спасибо.

1
nl ja de
Спасибо за предоставление мне подсказки! Я осматривал некоторых теперь, не находя решение проблемы, которую вы описываете. Не используя HttpURLConnection явский класс. Что я должен использовать, чтобы отправить запросы, если Printwriter не работает?
добавлено автор Martin, источник
Спасибо за помощь Кристофер! Это было очень полезно! я изменил читателей/писателей, что я раньше получал данные из сервера и отправки назад его клиенту, и это решило начальную проблему.
добавлено автор Martin, источник
Необходимо искать HTTP 1.1 RFC. Есть , СОЕДИНЯЮТСЯ приказывают, чтобы вы действовали на и ответить на. Просто просмотрев заголовки для Хозяина: не правильно: вы shouldn' t делают это. Остальная часть написания полномочия в основном просто копирует байты и реагирует правильно на условия ЭОС на каждой стороне. Вы shouldn' t должны замарать с связь: держите alive\U 0026\\U 0023\47; близко , например.
добавлено автор EJP, источник
Избегите Читатель и Писатель , используйте их передачу InputStream и OutputStream . Как @karakuricoder говорит, Читатель и , который Писатель для знаков, в то время как InputStream и OutputStream для байтов. Когда вы используете InputStreamReader или OutputStreamWriter , не определяя кодирование, you' ре, портящее ваши байты, преобразовывая их согласно кодировке по умолчанию платформы, которая является, во всех отношениях, глобальной случайной переменной. Вы никогда не должны не определять кодирование, используя их, и в этом случае необходимо только передать заголовки через них.
добавлено автор Christoffer Hammarström, источник
Разъясниться: заголовки - данные о характере, и вы должны , возможно , используют Читателей и Писателей для тех, и если вы делаете, определенно необходимо определить кодирование you' использование ре, которое для HTTP является ISO-8859-1, если я вспоминаю правильно. Остальную часть данных нужно рассматривать так просто байты и пройти, как, используя InputStream/OutputStream.
добавлено автор Christoffer Hammarström, источник
Первый румянец - это you' ре используя PrintWriter, который символьно-ориентирован, you' ll нужен основанный на байте поток для изображений
добавлено автор karakuricoder, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

ntwrk
ntwrk
1 773 участник(ов)

Группа для сетевых инженеров Создатель группы: @HelloSadness Админы: @darwinggl @mxssl @Sk1f3r @blademd @gngbng

RU.SYSADMIN — Олды здесь?
RU.SYSADMIN — Олды здесь?
1 616 участник(ов)

Ламповая конференция сисадминов! Правила: http://telegra.ph/Pravila-ru-sysadmin-12-01 Список интересных групп и каналов: https://github.com/goq/telegram-list

Pro Telecom
Pro Telecom
884 участник(ов)

Добро пожаловать, связисты! Запрещена реклама чатов Cообщество для своих - https://www.facebook.com/groups/protelecom/ https://vk.com/telecomrf

pro.enterprise
pro.enterprise
346 участник(ов)

Темы обсуждения: Сервера, системы хранения данных, hardware, software, сети хранения данных, сетевое оборудование, облачные инфраструктуры и никакой политики.

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async