java socket(4)
获取socket信息
打开本地tomcat服务器,访问"http://localhost:8080/index.jsp
以下通过java socket请求
package ch02;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class HTTPClient {
String host = "127.0.0.1";
int port = 80;
Socket socket;
public void createSocket() throws UnknownHostException, IOException {
socket = new Socket(host, 8080);
}
public void communicate() throws Exception {
// 注意GET后有空格,HTTP/1.1前有空格
StringBuffer sb = new StringBuffer("GET " + "/index.jsp"
+ " HTTP/1.1\r\n");
sb.append("Host:" + host + "\r\n");
sb.append("Accept:*/*\r\n");
sb.append("Accept-Language:zh-cn\r\n");
sb.append("Accept-Encoding:gzip,deflate\r\n");
sb.append("User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.0)\r\n");
sb.append("Connection:Keep-Alive\r\n\r\n");
// 发出HTTP请求
/*
* 先把字符串形式的的请求转换成字节数组(即字符串的编码,再请求)
*/
OutputStream socketOut = socket.getOutputStream();
socketOut.write(sb.toString().getBytes());
socket.shutdownOutput();
// 接收相应结果
InputStream socketIn = socket.getInputStream();
/*
* 接收数据时,把接收的的数据写到一个ByteArrayOutputStream,它是一个容量能自动增长的缓冲区
* len = socketIn.read(buff)) == -1表示读到了输入流的末尾
*/
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len = -1;
while ((len = socketIn.read(buff)) != -1) {
buffer.write(buff, 0, len);
}
System.out.println(new String(buffer.toByteArray()));
/*
* 如果接受的网页数据过大,先把数据保存到ByteArrayOutputStream会占用大量内存,更有效的做法是使用
* Bufferedreader逐行读取
*/
BufferedReader br=new BufferedReader(new InputStreamReader(socketIn));
String data=null;
while((data=br.readLine())!=null){
System.out.println(data);
}
socket.close();
}
public static void main(String[] args) throws Exception {
HTTPClient client = new HTTPClient();
client.createSocket();
client.communicate();
}
}
控制台答应结果(部分)