Get запрос java через socket

Русские Блоги

Простая реализация отправки и получения HTTP-сообщений через Java Socket

Последний раз Java Socket Realistic Простой HTTP-сервис Мы реализовали простой HTTP-сервис, который можно использовать для имитации HTTP-сервиса, и он может перехватывать исходный поток кода HTTP-запроса. Давайте четко разберемся со структурой HTTP-сообщения, которое мы отправляем в сервис. Ясное понимание. В этом разделе я хочу написать клиентскую программу, которая используется для имитации браузера, отправляющего HTTP-запросы на сервер.Самым важным является его использование для отображения общей структуры ответного HTTP-сообщения, отправляемого сервером.

import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; /** * Простой HTTP-клиент, который отправляет HTTP-запросы и имитирует браузер * Печатает HTTP-сообщения с сервера */ public class SimpleHttpClient < private static String encoding = "GBK"; public static void main(String[] args) < try < Socket s = new Socket(InetAddress.getLocalHost(), 8080); OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream()); StringBuffer sb = new StringBuffer(); sb.append("GET /HttpStream/gb2312.jsp HTTP/1.1\r\n"); sb.append("Host: localhost:8088\r\n"); sb.append("Connection: Keep-Alive\r\n"); // Обратите внимание, это ключевой момент, забудьте, что мне потребовалось полчаса, чтобы сделать это. Здесь должен быть возврат каретки и перевод строки, указывающий, что заголовок сообщения окончен, иначе сервер будет ждать sb.append("\r\n"); osw.write(sb.toString()); osw.flush(); // --- выводим информацию заголовка сообщения, возвращаемого сервером InputStream is = s.getInputStream(); String line = null; int contentLength = 0; // Длина сообщения, отправленного сервером // читаем заголовки параметров запроса, отправленные всеми серверами do < line = readLine(is, 0); // если есть заголовок сообщения Content-Length if (line.startsWith("Content-Length")) < contentLength = Integer.parseInt(line.split(":")[1].trim()); >// Распечатать запрос информации отдела System.out.print(line); // Если встречается отдельный возврат каретки, заголовок запроса заканчивается > while (!line.equals("\r\n")); // --- тело входного сообщения System.out.print(readLine(is, contentLength)); // Закрыть поток is.close(); > catch (UnknownHostException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >> /* * Здесь мы сами симулируем чтение строки, потому что если в API используется BufferedReader, то после чтения возврата каретки и перевода строки * Только возврат, в противном случае, если нет чтения, он всегда будет блокироваться, прямой сервер автоматически закроется до истечения времени ожидания, если вы все еще используете BufferedReader * При чтении, потому что при прочтении последней строки не будет возврата каретки и новой строки после последней строки, поэтому он будет ждать. Если отправлено обратно с использованием сервера * Content-Length в заголовке сообщения, чтобы перехватить тело сообщения, чтобы оно не блокировалось * * параметр contentLe Если он равен 0, это означает чтение заголовка, мы все равно возвращаем построчно при чтении, если это не 0, это означает чтение тела сообщения * Когда мы читаем тело сообщения в соответствии с длиной тела сообщения, клиент автоматически закрывает поток, поэтому ему не нужно время на сервер, чтобы закрыть его. */ private static String readLine(InputStream is, int contentLe) throws IOException < ArrayList lineByteList = new ArrayList(); byte readByte; int total = 0; if (contentLe != 0) < do < readByte = (byte) is.read(); lineByteList.add(Byte.valueOf(readByte)); total++; >while (total else < do < readByte = (byte) is.read(); lineByteList.add(Byte.valueOf(readByte)); >while (readByte != 10); > byte[] tmpByteArr = new byte[lineByteList.size()]; for (int i = 0; i < lineByteList.size(); i++) < tmpByteArr[i] = ((Byte) lineByteList.get(i)).byteValue(); >lineByteList.clear(); return new String(tmpByteArr, encoding); > > 

Доступ к странице во время выполнения печатается следующим образом:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=61F659691475622CE7AB9C84E7AE7273; Path=/HttpStream
Content-Type: text/html;charset=GB2312
Content-Length: 81
Date: Mon, 09 Nov 2009 13:15:23 GMT

Как насчет загрузки файла?

Запрашиваемая страница Jsp выглядит следующим образом:

     
0) < readCount = is.read(readContent); os.write(readContent, 0, readCount); >is.close(); // Заметка здесь должна быть закрыта, в противном случае выдается исключение, смотрите исключение ниже, причина в response.getWriter () // Не может использоваться одновременно с response.getOutputStream (), если закрыто здесь, передняя и задняя грани // Данные, записанные в объекте out, не будут обновлены клиенту, а будут записаны только в response.getOutputStream () // Данные будут выводиться клиенту. os.close(); > catch (Exception e) < e.printStackTrace(); >%>

Если вы закомментируете os.close () на странице загрузки Jsp выше, появится следующее исключение:

org.apache.jasper.JasperException: getOutputStream() has already been called for this response org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:476) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:383) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
java.lang.IllegalStateException: getOutputStream() has already been called for this response org.apache.catalina.connector.Response.getWriter(Response.java:601) org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196) org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:185) org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116) org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76) org.apache.jsp.gb2312_jsp._jspService(gb2312_jsp.java:78) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Ниже приведен файл скомпилированного класса сервлета, сгенерированный сервером:

package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.io.InputStream; import java.io.FileInputStream; import java.io.OutputStream; public final class gb2312_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent < private static java.util.List _jspx_dependants; public Object getDependants() < return _jspx_dependants; >public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException < JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try < _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html; charset=GB2312"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\t 
\r\n"); out.write("\t\t"); try < InputStream is = new FileInputStream("e:/tmp/file2.txt"); OutputStream os = response.getOutputStream(); byte[] readContent = new byte[1024]; int readCount = 0; while (is.available() >0) < readCount = is.read(readContent); os.write(readContent, 0, readCount); >is.close(); // Заметка здесь должна быть закрыта, в противном случае выдается исключение, смотрите исключение ниже, причина в response.getWriter () // Не может использоваться одновременно с response.getOutputStream (), если закрыто здесь, передняя и задняя грани // Данные, записанные в объекте out, не будут обновлены клиенту, а будут записаны только в response.getOutputStream () // Данные будут выводиться клиенту. os.close(); > catch (Exception e) < e.printStackTrace(); >out.write("\r\n"); out.write("\t\r\n"); out.write(""); > catch (Throwable t) < if (!(t instanceof SkipPageException))< out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); >> finally < if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); >> >

Наконец, поток кода, выводимый службой клиенту, выглядит следующим образом:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=328097D70C625E8A9279FF9472319A5D; Path=/HttpStream
Content-Type: text/html;charset=GB2312
Content-Length: 60
Date: Mon, 09 Nov 2009 13:19:22 GMT

Источник

Get запрос java через socket

Неужели в задаче такая важная тема сокрыта? Я спокойно прорешал решил зайти в комментарии и увидел много различных не понятных мне терминов.

С удивлением обнаружил, что выполнить GET запрос к реальному HTTP-серверу не так уж и просто. Чаще всего сервер в процессе диалога просто уходил в бесконечное ожидание. Больше всего мне помогло заполнение всех заголовков («Host:», «User-Agent:», «Accept:», «Accept-Language:», «Accept-Encoding:») и обязательно «Connection: close». Когда заполнил все эти заголовки, то все сервера (а я пробовал несколько) стали отвечать сразу и без задержки.

Инфа по последней задаче: Среднее количество попыток для этой задачи 2.49. Всего эту задачу решили 1938 учеников.

по первой задаче нашел чит — запустите валидацию до решения, валидатор выдаст почти исчерпывающий ответ как решать. правда почему так я не понял

Подскажите пожалуйста, почему проходит решение с url.getHost(), который возвращает «javarush.ru»,а не полный исходный адрес «http://javarush.ru/social.html» ?

 Socket socket = new Socket(url.getHost(), 80); 

Как написали ниже по второй задаче: «если реализовываешь двунаправленный интерфейс, то при создании потока ввода вешается блокировка в ожидании потока вывода. А его еще нет. И конструктор потока ввода висит в ожидании.» Вопрос: а как именно и где конструктор ввода ищет поток вывода? Как реализован этот поиск? А если я хочу просто из файла на диске почитать объекты и мне не нужен поток вывода? Тогда поток ввода создастся? Откуда Java знает, что мой интерфейс «двунаправленный»?

Объясните пожалуйста решение 2й задачи. Почему метод сброса буфера должен идти до инициализации входного потока? Как это связанно?

Источник

java socket — Write to socket a simple http get request — java socket tutorial — socket — socket io — python socket — java socket — socks proxy — socket programming

Write to socket a simple http get request, and dump response

 /** * we reuse a class written in example: * pleas to familiar with it first to continue with this one **/ public class WriteToSocketExample extends ConnectSocketExample < private String CRLF = "\r\n"; // line termination (separator) /** * write a simple http get request to socket * @param host - host to establish a connection * (http server - see ConnectSocketExample HTTP_PORT ) * @param path - path to file ( in this case a url location - part used in browser after host) * @return a connected socket with filled in raw get request * @throws IOException - see ConnectSocketExample.connectSocket(host); */ protected Socket writeGetToSocket(String host, String path) throws IOException < // create simple http raw get request for host/path String rawHttpGetRequest = "GET "+ path +" HTTP/1.1 " + CRLF // request line + "Host: "+ host + CRLF + CRLF; // get bytes of this request using proper encodings byte[] bytesOfRequest = rawHttpGetRequest.getBytes(Charset.forName("UTF-8)")); // create & connect to socket Socket socket = connectSocket(host); // get socket output stream OutputStream outputStream = socket.getOutputStream(); // write to the stream a get request we created outputStream.write(bytesOfRequest); // return socket with written get request return socket; >/** * create, connect and write to socket simple http get request * then dump response of this request * @throws IOException */ public void writeToSocketAndDumpResponse() throws IOException < // send request to http server for / page content Socket socket = writeGetToSocket("google.com", "/"); // now we will read response from server InputStream inputStream = socket.getInputStream(); // create a byte array buffer to read respons in chunks byte[] buffer = new byte[1024]; // define a var to hold count of read bytes from stream int weRead; // read bytes from socket till exhausted or read time out will occurred ( as we didn't add in raw get header Connection: close (default keep-alive) while ((weRead = inputStream.read(buffer)) != -1) < // print what we have read System.out.print(new String(buffer)); >> >
click below button to copy the code. By Socket tutorial team

java http socket example http socket programming java java socket http request socket http request c http client server program in java socket http request python java socket read http request java program for http request using socket socket http request c implementation of http request using socket in java php dump request php print request headers http request bin http post test server test http post http post test page http post test tool php log http request socket socket io python socket java socket socks proxy socket programming socket programming in java network programming node js socket io java serversocket network socket socket programming in c socket c what is a socket tcp socket java networking python socket programming nodejs socket socket types socket connect linux socket python network programming java network programming serversocket socket internet socket error unix socket unix network programming socket io tutorial sockets tutorial java socket tutorial python socket tutorial java networking tutorial socket programming tutorial socket programming in c tutorial java socket programming tutorial c socket tutorial android socket tutorial network programming tutorial php socket tutorial python socket programming tutorial python networking tutorial linux socket tutorial

    INTERVIEW TIPS
  • Final Year Projects
  • HR Interview Q&A
  • GD Interview
  • Resume Samples
  • Engineering
  • Aptitude
  • Reasoning
  • Company Questions
  • Country wise visa
  • Interview Dress Code CAREER GUIDANCE
  • Entrance Exam
  • Colleges
  • Admission Alerts
  • ScholarShip
  • Education Loans
  • Letters
  • Learn Languages

World’s No 1 Animated self learning Website with Informative tutorials explaining the code and the choices behind it all.

Источник

Lesson: All About Sockets

URL s and URLConnection s provide a relatively high-level mechanism for accessing resources on the Internet. Sometimes your programs require lower-level network communication, for example, when you want to write a client-server application.

In client-server applications, the server provides some service, such as processing database queries or sending out current stock prices. The client uses the service provided by the server, either displaying database query results to the user or making stock purchase recommendations to an investor. The communication that occurs between the client and the server must be reliable. That is, no data can be dropped and it must arrive on the client side in the same order in which the server sent it.

TCP provides a reliable, point-to-point communication channel that client-server applications on the Internet use to communicate with each other. To communicate over TCP, a client program and a server program establish a connection to one another. Each program binds a socket to its end of the connection. To communicate, the client and the server each reads from and writes to the socket bound to the connection.

What Is a Socket?

A socket is one end-point of a two-way communication link between two programs running on the network. Socket classes are used to represent the connection between a client program and a server program. The java.net package provides two classes—Socket and ServerSocket—that implement the client side of the connection and the server side of the connection, respectively.

Reading from and Writing to a Socket

This page contains a small example that illustrates how a client program can read from and write to a socket.

Writing a Client/Server Pair

The previous page showed an example of how to write a client program that interacts with an existing server via a Socket object. This page shows you how to write a program that implements the other side of the connection—a server program.

Источник

Читайте также:  Row gap css flex
Оцените статью