1. 程式人生 > >java 實現http協議傳送接收資料

java 實現http協議傳送接收資料

java模擬 post/get方式傳送資料   main方法中用的是post

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;


public class httpurl {

    private static final String TAG = "netUtils";

    /**
     * 使用post方式登陸
     *
     * @param username
     * @param password
     * @return
     */
    public static void main(String []args){
        httpurl test=new httpurl();
        test.loginOfPost("niha","qwer1234");
    }
    public static String loginOfPost(String username, String password) {
        HttpURLConnection conn = null;
        try {
            // 建立一個URL物件
            URL mURL = new URL("http://localhost:12001");
            // 呼叫URL的openConnection()方法,獲取HttpURLConnection物件
            conn = (HttpURLConnection) mURL.openConnection();

            conn.setRequestMethod("POST");// 設定請求方法為post
           /* conn.setReadTimeout(5000);// 設定讀取超時為5秒
            conn.setConnectTimeout(10000);// 設定連線網路超時為10秒*/
            conn.setDoOutput(true);// 設定此方法,允許向伺服器輸出內容

            int len=0;
            String path="E:\\private_project\\github_project\\nsar\\test.txt";
            // post請求的引數
            byte[] buf= new byte[10240];
            FileInputStream fis=new FileInputStream(path);
            while((len = fis.read(buf)) != -1){
                System.out.print(len);
            }
//            String data = "username=" + username + "&password=" + password;
            // 獲得一個輸出流,向伺服器寫資料,預設情況下,系統不允許向伺服器輸出內容
            OutputStream out = conn.getOutputStream();// 獲得一個輸出流,向伺服器寫資料
//            out.write(data.getBytes());
            out.write(buf);
            out.flush();
            out.close();

            int responseCode = conn.getResponseCode();// 呼叫此方法就不必再使用conn.connect()方法
            if (responseCode == 200) {

                InputStream is = conn.getInputStream();
                String state = getStringFromInputStream(is);
                return state;
            } else {
//                Log.i(TAG, "訪問失敗" + responseCode);
                System.out.print("訪問失敗");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();// 關閉連線
            }
        }

        return null;
    }

    /**
     * 使用get方式登陸
     *
     * @param username
     * @param password
     * @return
     */
    public static String loginOfGet(String username, String password) {
        HttpURLConnection conn = null;

        String data = "username=" + URLEncoder.encode(username) + "&password="+ URLEncoder.encode(password);
        String url = "http://192.168.0.100:8080/android/servlet/LoginServlet?"+ data;
        try {
            // 利用string url構建URL物件
            URL mURL = new URL(url);
            conn = (HttpURLConnection) mURL.openConnection();

            conn.setRequestMethod("GET");
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(10000);

            int responseCode = conn.getResponseCode();
            if (responseCode == 200) {

                InputStream is = conn.getInputStream();
                String state = getStringFromInputStream(is);
                return state;
            } else {
//                Log.i(TAG, "訪問失敗" + responseCode);
                System.out.print("訪問失敗");

            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            if (conn != null) {
                conn.disconnect();
            }
        }

        return null;
    }

    /**
     * 根據流返回一個字串資訊         *
     * @param is
     * @return
     * @throws IOException
     */
    private static String getStringFromInputStream(InputStream is)
            throws IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 模板程式碼 必須熟練
        byte[] buffer = new byte[1024];
        int len = -1;
        // 一定要寫len=is.read(buffer)
        // 如果while((is.read(buffer))!=-1)則無法將資料寫入buffer中
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        is.close();
        String state = os.toString();// 把流中的資料轉換成字串,採用的編碼是utf-8(模擬器預設編碼)
        os.close();
        return state;
    }
}

java 模擬伺服器端接收post/get資料  實現時不需要向客戶端返回資料,只需要接受客戶端發過來的資料 所以response 註釋掉了

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by lpeiz on 2016/9/26.
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(12001);
//            System.out.println("HTTP Server (only POST implemented) is ready and is listening on Port Number 12001 \n");
            while(true) {
                Socket clientSocket = serverSocket.accept();
//                System.out.println(clientSocket.getInetAddress().toString() + " " + clientSocket.getPort());
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//                OutputStream out = clientSocket.getOutputStream();
                String temp;
                int i=1001;
                while((temp=in.readLine()) != null)
                    System.out.println(temp+i++);
//                String response = "HTTP/1.1 200 OK\n\r";
//                response = response + "Date: Fri, 04 May 2001 20:08:11 GMT\n\r";
//                response = response + "Server: Sanjits Server\n\r";
//                response = response + "Connection: close\n\r";
//                response = response + "1";
//                byte[] bytes = response.getBytes();
//                byte[]bytes=new byte[1024];
//                out.write(bytes);
//                out.flush();
                in.close();
//                out.close();
            }
        } catch(Exception e) {
            System.out.println("ERROR: " + e.getMessage());
            System.exit(1);
        }}}


國慶節前看了一個案例  但是跑的時候發現是錯誤的 13年前的帖子,現在還用這計數也確實該多學點先進的技術了

https://coderanch.com/t/205623/java/Java-Http-Server-Java-Http

對客戶端的程式參照網上找到的其他成功的程式 改造了一下,加了兩行發現成功了。。。

 con.setReadTimeout(5000);// 設定讀取超時為5秒
            con.setConnectTimeout(10000);// 設定連線網路超時為10秒
就是這個控制時間的兩行,還沒搞清楚為什麼。可能是類似jdbc連線的時候的語句執行之後的重新整理問題
public class Client {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://localhost:12001");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setDoOutput(true);
//            con.setDoInput(true);
            con.setRequestMethod("POST");
//            con.setUseCaches(false);
            con.setReadTimeout(5000);// 設定讀取超時為5秒
            con.setConnectTimeout(10000);// 設定連線網路超時為10秒

            String test = "<name>Hello</name>";
            byte[] bytes = test.getBytes();

//            con.setRequestProperty("Content-type", "text/html");

            OutputStream out = con.getOutputStream();

            out.write(bytes);
            out.flush();
            out.close();
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String temp;
            while((temp = in.readLine()) != null)
                System.out.println(temp);
//            out.close();
            in.close();
            con.disconnect();
        } catch(Exception e) {
            e.printStackTrace();
            System.exit(1);}}}