Java流套接字只能发送一次

发布于 2024-10-14 03:09:17 字数 7206 浏览 8 评论 0原文

我正在编写一个简单的下载加速器。问题是我只能发送和接收消息一次。下次我尝试发送和接收消息时,我没有收到服务器的响应。我什至不确定是否能够发送第二条消息。

第一条消息类似于;

*HEAD /TIPS/LAWLER/PANOHOW2.PDF HTTP/1.0\r\n   
HTTP/1.0\r\n  
Connection: close\r\n  
\r\n*

响应是;

*HTTP/1.1 200 OK  
Date: Mon, 24 Jan 2011 10:53:38 GMT  
Server: Apache  
Last-Modified: Tue,  
22 Sep 1998 13:19:52 GMT  
ETag: "1968013-2b4f4-3386e15b6ee00"  
Accept-Ranges: bytes  
Content-Length: 177396  
Connection: close  
Content-Type: application/pdf*

当我尝试发送消息时;

GET /TIPS/LAWLER/hedeh/PANOHOW2.PDF HTTP/1.0\r\n  
Range: bytes=0-44349\r\n  
Connection: close\r\n   
\r\n

我什么也没得到。

我的代码有什么问题吗?

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {



            //Parse URL
            String cmd = "http://www.imaging-resource.com"; //Host Name
            if (cmd.contains("http://"))
            {
                cmd = cmd.substring(7); //
                if (cmd.contains("/"))
                {
                    int index = cmd.indexOf("/");
                    cmd = cmd.substring(0, index);
                    System.out.println(cmd);
                }
            }
            String str = "HEAD /TIPS/LAWLER/PANOHOW2.PDF HTTP/1.0\r\nConnection: close\r\n\r\n"; //First message to send




            //Create socket, connect, initialize read and write handlers
            //in, out
            Socket socket = null;           //Create a client socket
            SocketAddress sockaddr = null;
            InetAddress address = null;
            InputStream input = null;      //Input handler
            OutputStream output = null;    //Output handler

            try
            {
                address = InetAddress.getByName(cmd);           //Get ip using host name
                socket = new Socket();                          //Contrusct Socket
                sockaddr = new InetSocketAddress(address, 80);
                //socket.setTcpNoDelay(false);
                socket.connect(sockaddr, 2000);                 //Connect to server set and timeout to 2 sec
            } //End of try Block
            catch (Exception ex)
            {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println(ex);
            } //End of catch Block

             if (!socket.isConnected())
             {
                System.out.println("not connected");
                System.exit(-1);
             }


            //Sending package here
            try
            {
                int c;
                byte[] buf = new byte[65535];
                char[] chr = new char[65535];


                input = socket.getInputStream();            //Input handler is created
                output = socket.getOutputStream();          //Output handler is created
                buf = str.getBytes();                       //HEAD message converted into byte array
                output.write(buf);                          //Sending message to server
                output.flush();
                int counter = 0;


                while ((c = input.read()) != -1)        //Reading received package
                    chr[counter++]=(char)c;


                //input.reset();
                str = new String(chr);                  //For better manipulation, server message is converted to string
                System.out.println(str);

            } catch (IOException e)
            {
                System.err.print(e);
            } //End of catch








            int index = str.indexOf("Content-Length");  //Look for "Content-Length" in response
            str = str.substring(index);                 //Using its beginning index create an substring           
            index = str.indexOf("\r\n");                //Search for end of line
            str = str.substring(0, index);              //Erase end if line chars   - \r\n
            str = str.substring(16, str.length());      //"Content-Length: " 16 chars
            int fileSize = Integer.parseInt(str);       //Lentgh of file is converted to Integer


            int[][] parts = new int[4][2];              //Beginning and en of jobs for threads will be stored here
            int remainder = fileSize;                   //Bytes left to split for rest of the threads will be stored here
            int start = 0;
            int finish = 0;

            for (int i = 0; i < 4; i++)                 //Number of threads many times
            {
                parts[i][0] = start;                        //*******Each threads job Interval(eg. 0-108)
                //System.out.print(parts[i][0] + "-");      //******
                finish += remainder / 4 - i;                //*****
                parts[i][1] = finish;                       //****
                start = finish + 1;                         //***

                if (i + 1 == 4)
                parts[i][1] = fileSize;                     //*
            }

            str = "GET /TIPS/LAWLER/hedeh/PANOHOW2.PDF HTTP/1.0\r\nRange: bytes=" + parts[0][0] + "-" + parts[0][1] + "\r\nConnection: close\r\n\r\n";
            //System.out.println(str);


           if(!socket.isConnected())
           {
               System.out.println("closed");
               try
               {
                    socket.connect(sockaddr, 2000);
               }//End od try
               catch(Exception e){
                System.err.print(e);
                }//End of catch
            }//End of If
           System.out.println("Is Outputhandler closed :"+socket.isOutputShutdown());
           System.out.println("Is Inputhandler closed :"+socket.isInputShutdown());



          try
          {

               int c;
               byte[] buf = new byte[65535];
               char[] chr = new char[65535];


                buf = str.getBytes();                      //Output handler is created
                output.write(buf);                         //Sending message to server
                output.flush();
                int counter = 0;

                if((c = input.read()) != -1)
                {
                    chr[counter++] = (char) c;

                    while ((c = input.read()) != -1)                //Reading received package
                    {
                        System.out.println("response is not -1");
                        chr[counter++]=(char)c;
                    }


                    str = new String(chr);                  //For better manipulation, serve message is converted to string
                    System.out.println("Response "+str);
                }//End of If

                else System.out.println("No Response!");


            }catch(Exception e)
            {System.err.print(e);}

            //Closing open stuff
             try {
                output.close();
                input.close();
                socket.close();
            } catch (Exception e) {
                System.out.println(e);
            }




    }// End of main method
}//End of class definition

I'm writing a simple download accelerator. The problem is I can send and receive messages once. The next time I try to send and receive message, I get no response froms server. I'm not even sure if I am able to send the second message.

The first message is something like;

*HEAD /TIPS/LAWLER/PANOHOW2.PDF HTTP/1.0\r\n   
HTTP/1.0\r\n  
Connection: close\r\n  
\r\n*

and response is;

*HTTP/1.1 200 OK  
Date: Mon, 24 Jan 2011 10:53:38 GMT  
Server: Apache  
Last-Modified: Tue,  
22 Sep 1998 13:19:52 GMT  
ETag: "1968013-2b4f4-3386e15b6ee00"  
Accept-Ranges: bytes  
Content-Length: 177396  
Connection: close  
Content-Type: application/pdf*

When i attemp to sen message;

GET /TIPS/LAWLER/hedeh/PANOHOW2.PDF HTTP/1.0\r\n  
Range: bytes=0-44349\r\n  
Connection: close\r\n   
\r\n

I get nothing.

What is wrong with my code?

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {



            //Parse URL
            String cmd = "http://www.imaging-resource.com"; //Host Name
            if (cmd.contains("http://"))
            {
                cmd = cmd.substring(7); //
                if (cmd.contains("/"))
                {
                    int index = cmd.indexOf("/");
                    cmd = cmd.substring(0, index);
                    System.out.println(cmd);
                }
            }
            String str = "HEAD /TIPS/LAWLER/PANOHOW2.PDF HTTP/1.0\r\nConnection: close\r\n\r\n"; //First message to send




            //Create socket, connect, initialize read and write handlers
            //in, out
            Socket socket = null;           //Create a client socket
            SocketAddress sockaddr = null;
            InetAddress address = null;
            InputStream input = null;      //Input handler
            OutputStream output = null;    //Output handler

            try
            {
                address = InetAddress.getByName(cmd);           //Get ip using host name
                socket = new Socket();                          //Contrusct Socket
                sockaddr = new InetSocketAddress(address, 80);
                //socket.setTcpNoDelay(false);
                socket.connect(sockaddr, 2000);                 //Connect to server set and timeout to 2 sec
            } //End of try Block
            catch (Exception ex)
            {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println(ex);
            } //End of catch Block

             if (!socket.isConnected())
             {
                System.out.println("not connected");
                System.exit(-1);
             }


            //Sending package here
            try
            {
                int c;
                byte[] buf = new byte[65535];
                char[] chr = new char[65535];


                input = socket.getInputStream();            //Input handler is created
                output = socket.getOutputStream();          //Output handler is created
                buf = str.getBytes();                       //HEAD message converted into byte array
                output.write(buf);                          //Sending message to server
                output.flush();
                int counter = 0;


                while ((c = input.read()) != -1)        //Reading received package
                    chr[counter++]=(char)c;


                //input.reset();
                str = new String(chr);                  //For better manipulation, server message is converted to string
                System.out.println(str);

            } catch (IOException e)
            {
                System.err.print(e);
            } //End of catch








            int index = str.indexOf("Content-Length");  //Look for "Content-Length" in response
            str = str.substring(index);                 //Using its beginning index create an substring           
            index = str.indexOf("\r\n");                //Search for end of line
            str = str.substring(0, index);              //Erase end if line chars   - \r\n
            str = str.substring(16, str.length());      //"Content-Length: " 16 chars
            int fileSize = Integer.parseInt(str);       //Lentgh of file is converted to Integer


            int[][] parts = new int[4][2];              //Beginning and en of jobs for threads will be stored here
            int remainder = fileSize;                   //Bytes left to split for rest of the threads will be stored here
            int start = 0;
            int finish = 0;

            for (int i = 0; i < 4; i++)                 //Number of threads many times
            {
                parts[i][0] = start;                        //*******Each threads job Interval(eg. 0-108)
                //System.out.print(parts[i][0] + "-");      //******
                finish += remainder / 4 - i;                //*****
                parts[i][1] = finish;                       //****
                start = finish + 1;                         //***

                if (i + 1 == 4)
                parts[i][1] = fileSize;                     //*
            }

            str = "GET /TIPS/LAWLER/hedeh/PANOHOW2.PDF HTTP/1.0\r\nRange: bytes=" + parts[0][0] + "-" + parts[0][1] + "\r\nConnection: close\r\n\r\n";
            //System.out.println(str);


           if(!socket.isConnected())
           {
               System.out.println("closed");
               try
               {
                    socket.connect(sockaddr, 2000);
               }//End od try
               catch(Exception e){
                System.err.print(e);
                }//End of catch
            }//End of If
           System.out.println("Is Outputhandler closed :"+socket.isOutputShutdown());
           System.out.println("Is Inputhandler closed :"+socket.isInputShutdown());



          try
          {

               int c;
               byte[] buf = new byte[65535];
               char[] chr = new char[65535];


                buf = str.getBytes();                      //Output handler is created
                output.write(buf);                         //Sending message to server
                output.flush();
                int counter = 0;

                if((c = input.read()) != -1)
                {
                    chr[counter++] = (char) c;

                    while ((c = input.read()) != -1)                //Reading received package
                    {
                        System.out.println("response is not -1");
                        chr[counter++]=(char)c;
                    }


                    str = new String(chr);                  //For better manipulation, serve message is converted to string
                    System.out.println("Response "+str);
                }//End of If

                else System.out.println("No Response!");


            }catch(Exception e)
            {System.err.print(e);}

            //Closing open stuff
             try {
                output.close();
                input.close();
                socket.close();
            } catch (Exception e) {
                System.out.println(e);
            }




    }// End of main method
}//End of class definition

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

粉红×色少女 2024-10-21 03:09:17

第一条消息类似于;

HTTP/1.0\r\n  

您必须使用 HTTP 版本 1.1 才能在单个 TCP 连接上使用多个请求。

来自关于 HTTP 的维基百科文章

在 HTTP/0.9 和 1.0 中,连接在单个请求/响应对后关闭。在 HTTP/1.1 中引入了一种保持活动机制,其中一个连接可以重复用于多个请求。


此外,正如 @Joachim Sauer 在评论中指出的那样,您明确表示 Connection :在标题中关闭。 :-)

The first message is something like;

HTTP/1.0\r\n  

You have to use HTTP version 1.1 to use multiple requests on a single TCP connection.

From the Wikipedia article on HTTP:

In HTTP/0.9 and 1.0, the connection is closed after a single request/response pair. In HTTP/1.1 a keep-alive-mechanism was introduced, where a connection could be reused for more than one request.


Also, as @Joachim Sauer points out in the comments, you're explicitly saying Connection: close in your header. :-)

深海蓝天 2024-10-21 03:09:17

我认为问题在于您正在尝试使用普通 TCP 套接字连接到 HTTP 服务器。是的,HTTP 位于 TCP 之上,但它是一个复杂的协议,需要了解很多东西。我建议您使用更高级别的API来实现HTTP协议并为您提供更方便的API。

最简单的例子是 JDK 中的 URL+URLConnection。可能更好的是来自 Jakarta 的 HttpClient。

I think that the problem is that you are trying to connect to HTTP server using plain TCP socket. Yes, HTTP is on top of TCP but it is complicated protocol that requires a lot of things to know. I'd suggest you to work with higher level API that implements HTTP protocol and provides you more convenient API.

The simplest example is URL+URLConnection from JDK. Probably better is HttpClient from Jakarta.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文