Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用套接字对http服务器的长时间读取请求体_Java_Android_Sockets - Fatal编程技术网

Java 使用套接字对http服务器的长时间读取请求体

Java 使用套接字对http服务器的长时间读取请求体,java,android,sockets,Java,Android,Sockets,我正在使用套接字在JavaAndroid应用程序上创建http套接字服务器。 从客户端和服务器上发送和获取头文件,我的速度很快。但在尝试读取http正文时,需要花费很长时间。。。为什么? 主课 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

我正在使用套接字在JavaAndroid应用程序上创建http套接字服务器。 从客户端和服务器上发送和获取头文件,我的速度很快。但在尝试读取http正文时,需要花费很长时间。。。为什么?

主课

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
                public void run() {
                    try {
                        runProxy();
                    }catch (Throwable t){

                    }
                };
        }).start();
    }

    private void runProxy() throws Throwable{
        try {
            ServerSocket ss = new ServerSocket(8080);
            while (true) {
                Socket s = ss.accept();
                System.err.println("Client accepted");
                new Thread(new TestProxy(s)).start();
            }
        }catch (IOException e){

        }

    }
TestProxy.class

public class TestProxy implements Runnable{

    private Socket s, c;
    private InputStream is;
    private OutputStream os;

    ArrayList<String> requestList;
    ArrayList<String> responseList;

    private BufferedReader br;

    public TestProxy(Socket s) throws Throwable{
        this.s = s;
        this.is = s.getInputStream();
        this.os = s.getOutputStream();

        this.requestList = new ArrayList<String>();
        this.responseList = new ArrayList<String>();

        this.run();
    }

    public void run(){
        try {
            this.readRequest();
            this.forwardRequest();
            this.forwardResponse(); //<--- this is trouble ??!
        }catch (Throwable e){

        }finally {
            /*try {
                s.close();
                c.close();
            }catch (IOException e) {}*/
        }
    }

    private void readRequest() throws Throwable{
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        //int lengthBody = 0;
        while(true) {
            String s = br.readLine();
            requestList.add(s + "\r\n");
            /*if (s.startsWith("Content-Length: ")) { // get the
                // content-length
                int index = s.indexOf(':') + 1;
                String len = s.substring(index).trim();
                lengthBody = Integer.parseInt(len);
            }*/
            if(s == null || s.trim().length() == 0) {
                break;
            }
        }

        is.close();

    }

    private void forwardRequest(){
        String firstSectionInProtocol = requestList.get(0); //GET http://example.com/?d=d HTTP/1.1
        Pattern p = Pattern.compile("^\\w+\\s+(\\S+)");
        Matcher m = p.matcher(firstSectionInProtocol);
        if(m.find()) {
            String URI = m.group(1); //http://example.com/?d=d
            try {
                URL aURL = new URL(URI);
                try {
                    c = new Socket(aURL.getHost(), 80);
                    final OutputStream outToServer = c.getOutputStream();

                    String firstSection = "GET "+aURL.getFile()+" HTTP/1.1\r\n";
                    outToServer.write(firstSection.getBytes());
                    System.out.println(firstSection);
                    for(int i = 1; i < requestList.size(); i++){
                        outToServer.write(requestList.get(i).getBytes());
                        System.out.println(requestList.get(i));
                    }
                    outToServer.flush();
                }catch (IOException e) {

                }

            }catch (MalformedURLException e){ }
        }
    }

    private void forwardResponse() throws Throwable{
        final InputStream inFromServer = c.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inFromServer));
        int lengthBody = 0;
        while(true) {
            String s = br.readLine();
            System.out.println( s + "\r\n" );
            if (s.startsWith("Content-Length: ")) { // get the
                // content-length
                int index = s.indexOf(':') + 1;
                String len = s.substring(index).trim();
                lengthBody = Integer.parseInt(len);
            }
            if(s.equals("")) {
                break;
            }
        }

        //
        // Processing long time
        //
        if (lengthBody > 0) {
            int read;
            StringBuilder body = new StringBuilder();
            while ((read = br.read()) != -1) {
                body.append((char) read);
                if (body.length() >= lengthBody)
                    break;
            }

            System.out.println(body.toString());
        }
    }

}
public类TestProxy实现可运行{
专用插座s,c;
私有输入流是;
私有输出流;
ArrayList请求列表;
ArrayList-responseList;
专用缓冲读取程序br;
公共TestProxy(套接字s)抛出可丢弃的{
这个.s=s;
this.is=s.getInputStream();
this.os=s.getOutputStream();
this.requestList=new ArrayList();
this.responseList=新的ArrayList();
这个。run();
}
公开募捐{
试一试{
这是readRequest();
this.forwardRequest();
this.forwardResponse();//0){
int-read;
StringBuilder主体=新的StringBuilder();
而((read=br.read())!=-1){
body.append((char)read);
if(body.length()>=lengthBody)
打破
}
System.out.println(body.toString());
}
}
}

在forwardResponse()方法中,我尝试获取正文响应。

空检查位置错误。这将导致NPE在流的末尾。您需要对RFC 2616和后续实现HTTP有很好的了解,特别是关于内容长度和分块传输的部分。
while(true) {
            String s = br.readLine();
            System.out.println( s + "\r\n" );
            /*if (s.startsWith("Content-Length: ")) { // get the
                // content-length
                int index = s.indexOf(':') + 1;
                String len = s.substring(index).trim();
                lengthBody = Integer.parseInt(len);
            }*/
            if(s == null) {
                break;
            }
        }