1. 程式人生 > >Java socket模擬傳送和接收HTTP訊息

Java socket模擬傳送和接收HTTP訊息

理解:模擬登陸指定網站,登陸成功後,獲取返回串中的cookie值用於發起下次請求。

package demo.http.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class JavaHttpClient {
	// common parameters
	private static String serverIP = "192.168.30.205";
	private static int serverPort = 80;
	private static String charset = "GBK";
	
	// login parameters
	private static String loginUrl = "/picp/SecurityAction.do?method=login";
	private static String loginNameIndex = "piUsersDto.usercode";// 使用者名稱索引
	private static String loginPwdIndex = "piUsersDto.password";// 密碼索引
	private static String loginName = "100001";//登陸使用者名稱
	private static String loginPwd = "111111";//登陸密碼
	private static String cookieIndex = "Set-Cookie: JSESSIONID=";//cookie索引串
	
	// check operation parameters
	private static String checkUrl="/picp/SingleInquireAction.do?method=query";
	private static String checkNameIndex="certname";//查詢名字索引
	private static String checkIdNumIndex="certno";//查詢證件號碼索引
	private static String checkType="businesscode";//查詢型別
	
	public static void main(String[] args) {
		JavaHttpClient obj=new JavaHttpClient();
		Socket clientSocket=null;
		try {
			clientSocket=new Socket(serverIP, serverPort);
			clientSocket.setSoTimeout(20*1000);
			//login
			String cookieValue=obj.login(clientSocket);
			if(cookieValue!=null){//check
				obj.checkOpt(clientSocket, cookieValue);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(clientSocket!=null){
				try {
					clientSocket.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		
	}

	/* 登陸操作,成功後返回cookie */
	private String login(Socket clientSocket) {
		String cookieValue=null;
		try {
			String loginStr=createLoginReqStr();
			clientSocket.getOutputStream().write(loginStr.getBytes(charset));
			clientSocket.getOutputStream().flush();
			String loginResponseStr=getResponseStr(clientSocket.getInputStream());
			//判斷是否登陸成功
			//end
			cookieValue=getCookieStr(loginResponseStr);
		}catch (Exception e) {
			e.printStackTrace();
		}
		return cookieValue;
	}

	/*組織登陸串*/
	private String createLoginReqStr() {
		try {
			String loginStr = loginNameIndex + "=" + loginName + "&"
					+ loginPwdIndex + "=" + loginPwd;
			StringBuffer sBuf = new StringBuffer();
			sBuf.append("POST " + loginUrl + " " + "HTTP/1.1\r\n");
			sBuf.append("Accept: "+ "text/html, application/xhtml+xml, */*\r\n");
			sBuf.append("Accept-Language: zh_CN\r\n");
			sBuf.append("Content-Type: application/x-www-form-urlencoded\r\n");
			sBuf.append("Host: " + serverIP + ":" + serverPort + "\r\n");
			sBuf.append("Content-Length: " + loginStr.getBytes(charset).length+"\r\n");
			sBuf.append("Connection: Keep-Alive\r\n");
			sBuf.append("Cache-Control: no-cache\r\n");
			sBuf.append("\r\n");
			sBuf.append(loginStr);
			return sBuf.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	

	/*查詢操作*/
	private void checkOpt(Socket clientSocket,String cookieValue){
		try {
			String checkStr=createCheckReqStr(cookieValue);
			clientSocket.getOutputStream().write(checkStr.getBytes(charset));
			clientSocket.getOutputStream().flush();
			String checkResponseStr=getResponseStr(clientSocket.getInputStream());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	

	/*組織查詢串*/
	private String createCheckReqStr(String cookieValue) {
		StringBuffer sBuf=new StringBuffer();
		try {
			String checkStr=checkType+"="+"01&"+checkNameIndex+"="+"熊大"+"&"+checkIdNumIndex+"="+"370785198910047763";
			for(int i=1;i<5;i++){
				checkStr=checkStr+"&"+checkNameIndex+"=&"+checkIdNumIndex+"=";
			}
			sBuf.append("POST " + checkUrl + " " + "HTTP/1.1\r\n");
			sBuf.append("Accept: "+ "text/html, application/xhtml+xml, */*\r\n");
			sBuf.append("Accept-Language: zh_CN\r\n");
			sBuf.append("Content-Type: application/x-www-form-urlencoded\r\n");
			sBuf.append("Host: " + serverIP + ":" + serverPort + "\r\n");
			sBuf.append("Content-Length: " + checkStr.getBytes(charset).length+"\r\n");
			sBuf.append("Connection: Keep-Alive\r\n");
			sBuf.append("Cache-Control: no-cache\r\n");
			sBuf.append("Cookie: JSESSIONID="+cookieValue+"\r\n");
			sBuf.append("\r\n");
			sBuf.append(checkStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sBuf.toString();
	}
	

	/*獲取返回值*/
	private String getResponseStr(InputStream ins){
		StringBuffer sBuf=new StringBuffer();
		int contentLength=0;//儲存http header中contentLength的值
		try {
			String aLine=null;
			do{
				aLine=readFromStream(ins, 0);
				if(aLine.contains("Content-Length")){
					contentLength=Integer.parseInt(aLine.split(":")[1].trim());
				}
				sBuf.append(aLine);
			}while(!aLine.equals("\r\n"));
			sBuf.append(readFromStream(ins, contentLength));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sBuf.toString();
	}


	/* 從流中讀取指定長度的位元組,readLenth為0時,讀取一行 */
	private String readFromStream(InputStream ins, int readLength) {
		try {
			byte tmpB;
			byte[] byteArr;
			if (readLength == 0) {// 讀取一行
				ArrayList byteList = new ArrayList();
				do {
					tmpB = (byte) ins.read();
					byteList.add(tmpB);
				} while (tmpB != 10);// 判斷是否換行
				byteArr = new byte[byteList.size()];
				for (int i = 0; i < byteList.size(); i++) {
					byteArr[i] = (Byte) byteList.get(i);
				}
				byteList.clear();
			} else {// 讀取指定長度
				int index = 0;
				byteArr = new byte[readLength];
				do {
					byteArr[index] = (byte) ins.read();
					index++;
				} while (index < readLength);
			}
			return new String(byteArr, charset);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	

	/*獲取cookie值*/
	private String getCookieStr(String loginResponseStr){
		String cookieValue=null;
		try {
			int index=loginResponseStr.indexOf(cookieIndex);
			System.out.println(index);
			if(index>-1){
				cookieValue = loginResponseStr.substring(index + 23, index + 55);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return cookieValue;
	}
}


相關推薦

Java socket模擬傳送接收HTTP訊息

理解:模擬登陸指定網站,登陸成功後,獲取返回串中的cookie值用於發起下次請求。 package demo.http.client; import java.io.IOException; import java.io.InputStream; import java.

Java TCP/IP Socket程式設計】----傳送接收資料----訊息成幀與解析

目錄   簡介 成幀與解析 成幀技術案例 簡介 在程式中使用套接字向其他程式提供資訊或者使用其他程式提供的資訊,這就需要任何需要交換資訊的程式間在資訊編碼方式上達成共識(包含了資訊交換的形式和意義),稱為協議,用來實現特定的應用程式的協議叫應用程式協議。大部分應

Java Socket傳送接收HTTP訊息簡單實現

  在上次Java Socket現實簡單的HTTP服務我們實現了簡單的HTTP服務,它可以用來模擬HTTP服務,用它可以截獲HTTP請求的原始碼流,讓我們很清楚的瞭解到我們向服務發的HTTP訊息的結構,對HTTP請求訊息有個清晰的認識。這一節我想寫了一個客戶的程式,就是用來

非同步SOCKET程式設計-傳送接收資料

我本想把傳送和接收分開作為兩部分,但是最後我決定只略微解釋一下 FD_READ ,留下更多的時間來說明更復雜的 FD_WRITE , FD_READ 事件非常容易掌握. 當有資料傳送過來時, WinSock 會以 FD_READ 事件通知你, 對於每一個 FD_READ 事件

非同步SOCKET程式設計-傳送接收資料[轉] 非同步SOCKET程式設計-傳送接收資料[轉]

Socket(套接字)◆先看定義: typedef unsigned int u_int; typedef u_int SOCKET; ◆Socket相當於進行網路通訊兩端的插座,只要對方的Socket和自己的Socket有通訊聯接,雙方就可以傳送和接收資料了。其定義類似於檔案控制代碼的定義。◆Socket有

解決Springboot整合ActiveMQ傳送接收topic訊息的問題

環境搭建 1.建立maven專案(jar) 2.pom.xml新增依賴 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo

Java TCP/IP Socket程式設計】----傳送接收資料----構建解析協議訊息

--------筆記來自於書籍《Java TCP/IP Socket程式設計》。 簡介 使用套接字時,通常要麼是需要同時建立通訊通道兩端的程式,要麼實現一個給定的協議進行通訊。如果知道通訊雙方都使用java實現,且擁有對協議的完全控制權,那麼就可以使用Java的內建工具如Serialiabl

java呼叫rabbitmq訊息佇列傳送接收訊息例項

消費者Consumer.java程式碼 package com.rabbitMQ.pro; import com.rabbitmq.client.ConnectionFactory; impor

java實現kafka訊息傳送接收

之前寫了一篇關於kafka叢集搭建的點選開啟連結。想了解的可以看下。今天這個實現是和前面叢集對應的。使用的是新版的API。屬性如果想定製自己的,需要到官方網址上面去檢視一下對應的值。推介大家多去看看官方的介紹和demo。網上有些翻譯過來的例子並不完善,最好是知己知彼,才能百戰

Java 小例子:通過 Socket 傳送接收檔案

這是一個簡單的包含傳送端和接收端的例子。傳送端向接收端傳送檔名和檔案內容,接收端將收到的檔案儲存在磁碟上。接收端可以同時接收多個傳送端傳來的檔案,但沒有處理檔案同名的情況。 這個例子中設計了一個簡單的協議。傳送的內容是這樣的: 檔名長度(4位元組)—檔名—檔案內容長度(4位

java socket連線以及傳送接收資料

/** * */ package socketTest2; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import

springboot kafka整合(包括java程式碼不能傳送消費kafka訊息的採坑記錄)

kafka採坑記錄:     1、kafka服務端server.properties中的broker.id叢集內需要唯一。     2、kafka config檔案中listeners和advertised.listeners需要配置本機ip:9092

MQTT Java客戶端Eclipse paho實現資料的傳送接收

MQTT(MQ Telemetry Transport)是IBM開發的一種網路應用層的協議 使用場景: 1、不可靠、網路頻寬小的網路 2、執行的裝置CPU、記憶體非常有限 特點: 1、基於釋出/訂閱模型的協議 2、他是二進位制協議,二進位制的特點就是緊湊、佔用

《商城專案06》--用ActiveMQ實現訊息傳送接收

一, 使用場景 對商品資訊進行操作的同時, 將資料同步到solr庫, 實現該需求有以下幾種方式: 方式1: 在e3-manager-service新增商品資訊的實現類中直接寫將資料新增到solr庫; <弊端: 負責商品資訊操作的開發人員不一定對solr熟悉, 所以得分離出來寫, 這裡可

利用API傳送接收訊息,本程式碼測試全通過

~_~一個程式設計師的淘寶店: 點選開啟連結 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Set

Android socket 使用PrintWriterBufferedReader傳送接收出現亂碼問題解決

專案中用到了Android和C++的通訊,選擇了用socket 傳送字元的方式,一開始使用的程式碼是: socket=new Socket(); InetSocketAddress isa = new InetSocketAddress(IP_STR,

26 API-網路程式設計(網路概述,Socket通訊機制,UDP協議傳送接收資料,TCP協議傳送接收資料)

1:網路程式設計(理解) (1)網路程式設計:用Java語言實現計算機間資料的資訊傳遞和資源共享(2)網路程式設計模型 l網路模型一般是指 OSI(Open System Interconnection開放系統互連)參考模型 TCP/IP參考模型 (3)網路程式

用PHP嘗試RabbitMQ(amqp擴充套件)實現訊息傳送接收

j教程: http://my.oschina.net/yuansir/blog/135226 消費者:接收訊息 邏輯: 建立連線-->建立channel-->建立交換機-->建立佇列-->繫結交換機/佇列/路由鍵-->接收訊息 <?

Java實現RS485串列埠通訊,傳送接收資料進行解析

  最近專案有一個空氣檢測儀,需要得到空氣檢測儀的實時資料,儲存到資料庫當中。根據瞭解得到,硬體是通過rs485進行串列埠通訊的,需要傳送16進制命令給儀器,然後通過輪詢來得到資料。   需要先要下載RXTX的jar包,win64位下載地址:http://pan.baidu.com/s/1o6zLmTc);

linux高階訊號傳送接收(附帶訊息

高階訊號傳送和接收  sigaction   1.可以讓訊號處理函式遮蔽訊號集   2.可以讓訊號處理函式在訊號響應的同時接收訊號源程序資訊和附帶訊息。  sigqueue   可以傳送訊號並同時傳送附帶訊息。   使用kill函式傳送訊號,sigaction可以接收到訊號