开发者社区> 问答> 正文

关于java的HTTPURLConnection的使用原理

一直对于http协议的请求原理不是很明白,于是做了如下测试
用ServerSocket做了一个服务端,接收请求,并获取输入流打印,
用HTTPURLConnertion向服务端发送请求,
第一次测试时,客户端只使用了输出流,并使用了flush().然后再close,结果服务端什么都没有输出
就报错了
第二次测试,客户端,即使用了输出流,又使用了输入流,然后再close,结果服务端,正常输出了于是迷茫了,到底时怎么回事啊,请问高手.

展开
收起
蛮大人123 2016-03-19 10:59:19 3579 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    public class HttpPostUploadUtil {  
      
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            String filepath = "E:\\ziliao\\0.jpg";  
            String urlStr = "http://127.0.0.1:8080/minicms/up/up_result.jsp";  
            Map<String, String> textMap = new HashMap<String, String>();  
            textMap.put("name", "testname");  
            Map<String, String> fileMap = new HashMap<String, String>();  
            fileMap.put("userfile", filepath);  
            String ret = formUpload(urlStr, textMap, fileMap);  
            System.out.println(ret);  
        }  
      
        /** 
         * 上传图片 
         * @param urlStr 
         * @param textMap 
         * @param fileMap 
         * @return 
         */  
        public static String formUpload(String urlStr, Map<String, String> textMap, Map<String, String> fileMap) {  
            String res = "";  
            HttpURLConnection conn = null;  
            String BOUNDARY = "---------------------------123821742118716"; //boundary就是request头和上传文件内容的分隔符    
            try {  
                URL url = new URL(urlStr);  
                conn = (HttpURLConnection) url.openConnection();  
                conn.setConnectTimeout(5000);  
                conn.setReadTimeout(30000);  
                conn.setDoOutput(true);  
                conn.setDoInput(true);  
                conn.setUseCaches(false);  
                conn.setRequestMethod("POST");  
                conn.setRequestProperty("Connection", "Keep-Alive");  
                conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");  
                conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);  
      
                OutputStream out = new DataOutputStream(conn.getOutputStream());  
                // text    
                if (textMap != null) {  
                    StringBuffer strBuf = new StringBuffer();  
                    Iterator<Map.Entry<String, String>> iter = textMap.entrySet().iterator();  
                    while (iter.hasNext()) {  
                        Map.Entry<String, String> entry = iter.next();  
                        String inputName = (String) entry.getKey();  
                        String inputValue = (String) entry.getValue();  
                        if (inputValue == null) {  
                            continue;  
                        }  
                        strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");  
                        strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n");  
                        strBuf.append(inputValue);  
                    }  
                    out.write(strBuf.toString().getBytes());  
                }  
      
                // file    
                if (fileMap != null) {  
                    Iterator<Map.Entry<String, String>> iter = fileMap.entrySet().iterator();  
                    while (iter.hasNext()) {  
                        Map.Entry<String, String> entry = iter.next();  
                        String inputName = (String) entry.getKey();  
                        String inputValue = (String) entry.getValue();  
                        if (inputValue == null) {  
                            continue;  
                        }  
                        File file = new File(inputValue);  
                        String filename = file.getName();  
                        MagicMatch match = Magic.getMagicMatch(file, false, true);  
                        String contentType = match.getMimeType();  
      
                        StringBuffer strBuf = new StringBuffer();  
                        strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");  
                        strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n");  
                        strBuf.append("Content-Type:" + contentType + "\r\n\r\n");  
      
                        out.write(strBuf.toString().getBytes());  
      
                        DataInputStream in = new DataInputStream(new FileInputStream(file));  
                        int bytes = 0;  
                        byte[] bufferOut = new byte[1024];  
                        while ((bytes = in.read(bufferOut)) != -1) {  
                            out.write(bufferOut, 0, bytes);  
                        }  
                        in.close();  
                    }  
                }  
      
                byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();  
                out.write(endData);  
                out.flush();  
                out.close();  
      
                // 读取返回数据    
                StringBuffer strBuf = new StringBuffer();  
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
                String line = null;  
                while ((line = reader.readLine()) != null) {  
                    strBuf.append(line).append("\n");  
                }  
                res = strBuf.toString();  
                reader.close();  
                reader = null;  
            } catch (Exception e) {  
                System.out.println("发送POST请求出错。" + urlStr);  
                e.printStackTrace();  
            } finally {  
                if (conn != null) {  
                    conn.disconnect();  
                    conn = null;  
                }  
            }  
            return res;  
        }   
    }  
    2019-07-17 19:07:40
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载