关于java的HTTPURLConnection的使用原理-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

关于java的HTTPURLConnection的使用原理

2016-03-19 10:59:19 3006 1

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

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 19:07:40
    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;  
        }   
    }  
    0 0
相关问答

1

回答

Java中提供了用于大数字运算的类有哪些?

2021-11-04 18:54:31 102浏览量 回答数 1

1

回答

java规约中,大括号的使用规则?

2021-03-01 13:28:07 352浏览量 回答数 1

0

回答

如何使用Java特定于操作系统的通知?

2019-12-04 17:13:55 400浏览量 回答数 0

1

回答

Java HasgMap为给定的键给出了错误的值

2019-11-28 18:46:48 498浏览量 回答数 1

4

回答

jstorm启动失败:Invalid initial heap sizeXms4g

2016-06-14 16:23:18 7661浏览量 回答数 4

1

回答

java中关于dismiss方法的使用

2016-03-24 17:11:49 1864浏览量 回答数 1

1

回答

hibernate jpa 拦截器的使用

2016-03-03 17:28:28 4053浏览量 回答数 1

1

回答

java利用HttpURLConnection读取二进制并返回!

2016-03-05 15:11:34 4206浏览量 回答数 1

1

回答

java使用c3p0连接mysql集群的问题

2016-02-08 00:43:33 2593浏览量 回答数 1

4

回答

java做的项目,用了struts2框架,本地可以访问,阿里云访问action提示404

2015-02-05 17:00:13 14632浏览量 回答数 4
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载