post的本质就是发送给目的程序一个标志为post的协议串如下:
04 | Accept-Language: zh-cn,en-us;q=0.5 |
05 | Content-Type: application/x-www-form-urlencoded |
06 | User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; .NET CLR 1.0.3705; .NET CLR 1.1.4322) |
08 | Content-Length: 发送数据的长度 |
10 | Cache-Control: no-cache |
11 | username=php&password=iask |
我想大家对form的post方法应该是最熟悉不过了,例如我们想吧用户名和密码发送给某个页面的时候,点击有两个文本域的表单的提交按钮,这个表单发送到action程序的就是以上数据。知道了这一点我想就不难了。
这时候我们只需要用php的socket打开一个端口,例如80端口,把以上信息利用这个端口发送给目的程序就行了。
我们如何在一个端口上建立一个socket信道呢?
在PHP中是如此简单呢!
fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
主机名称就是你需要发送数据的目的地;
端口号就是这个目的程序会在哪个端口等着你的数据;
错误号的接受变量,这个是如果建立socket不成功的时候返回的错误编号;
错误提示的变量,是错误的时候返回的错误提示信息;
超时时间,就是post数据之后如果对方没有回应信息,等待的最长时间。
如果不出意外(你正确的设置fsockopen()函数的参数)的话,一个socket信道现在已经打开了,我们下一步需要做的就是,通过这个打开的信道把post请求协议发给目的程序,这时候可以使用fwrite或者fputs函数中的任意一个,把post的请求格式发给fsockopen()打开的句柄,这时候一个伟大的socket模拟的post请求就诞生了。顺便说一下啊:
你发送的时候可不能把我的post请求格式直接ctrl + V过去,你没看见里面的汉字等你自己去填写的吗?
以上是文字的描述,如果大家觉得说的非常垃圾,非常没有说服力的话,下边有一个现成的程序片段,大家可以看看。
1 | $port = $url [ 'port' ] ? $url [ 'port' ] : 80; |
2 | $fp = fsockopen ( $url [ 'host' ], $port , $errno , $errstr ,10); |
3 | if (! $fp ) return "在主机: $url[host] $port 打开socket失败,失败原因是: $errno - $errstr" ; |
4 | fputs ( $fp , sprintf( "POST %s%s%s HTTP/1.0\r\n" , $url [ 'path' ], $url [ 'query' ] ? "?" : "" , $url [ 'query' ])); |
5 | fputs ( $fp , "Host:" . $url [ 'host' ]. "\r\n" ); |
6 | fputs ( $fp , "Content-type: application/x-www-form-urlencoded\r\n" ); |
7 | fputs ( $fp , "Content-length: " . strlen ( $encoded ) . "\r\n" ); |
8 | fputs ( $fp , "Connection: close\r\n\r\n" ); |
9 | fputs ( $fp , "$encoded\\n" ); |
对了还是顺便说一下吧,fgets($fp,1024);这个可以得到返回值的哦!!已经有不止一个人问过我咋接受返回了!!
package com.javaSocket;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TestClientHTTP {
/**
* @param args
*/
public static void main(String[] args) {
try {
Socket s = new Socket("192.168.0.102", 8080);
try{
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println("POST /studyProject/post/post1.jsp HTTP/1.1");
ps.println("Host: 192.168.0.102:8080");
ps.println("Content-Type: application/x-www-form-urlencoded");
//ps.println("Accept: */*");
/*
ps.println("Accept-Language: zh-cn");
ps.println("Accept-Encoding: gzip, deflate");
ps.println("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
ps.println("Connection: Keep-Alive");
ps.println("Cache-Control: no-cache");
*/
ps.println("Content-Length: 9");//Content-Length的值等于text1=456的长度,也就是POST数据的长度
ps.println("");
ps.println("text1=456");
Scanner in1 = new Scanner(s.getInputStream());
while(in1.hasNextLine()){
String input = in1.nextLine();
System.out.println(input);
}
}finally{
s.close();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}