package net.sonyhome.net;
import java.io.*; import java.net.*; import java.util.*; import java.text.*; /** * 一个用来访问http服务器的东西。功能类似于java.net中的那个。但要强,这个对Post方法的支持更好。 * 其实也不能说是我写的。不记得从哪儿找来的程序,稍事修改了一下。所以现在程序的结构都忘啦。 * 不过有一点是肯定的,那就是可以用。呵呵。 * 去年我做的Java版的精华区就是用这个类来访问的。 * Creation date: (2001-8-24 23:57:14) * @author: SonyMusic */ public class HttpConnection { private URL url = null; //private boolean doInput = true; //private boolean doOutput = true;
private boolean usePost = false;
private boolean useCaches = false;
private Vector reqHeaderNames = new Vector(); private Vector reqHeaderValues = new Vector(); private Vector resHeaderNames = null; private Vector resHeaderValues = null; private Socket socket = null; private OutputStream out = null; private InputStream in = null; private boolean useHttp11 = false;
private boolean connected = false;
private boolean inputStarted = false;
Hashtable postData = new Hashtable(); Hashtable getData = new Hashtable();
/** * HttpConnection constructor comment. */ public HttpConnection(URL url) { super(); this.url = url; } /** * Insert the method's description here. * Creation date: (2001-8-25 1:16:52) * @param name java.lang.String * @param value java.lang.String */ public void addGet(String name, String value) { getData.put(name, value); } /** * Insert the method's description here. * Creation date: (2001-8-25 1:16:52) * @param name java.lang.String * @param value java.lang.String */ public void addPost(String name, String value) { postData.put(name, value); } public void close() throws IOException { if (!connected) return; out.close(); if (inputStarted) in.close(); socket.close(); } public void connect() throws IOException { if (connected) return; if (!useCaches) { setRequestProperty("Pragma", "no-cache"); //setRequestProperty("Cache-Control", "no-cache, must-revalidate"); //setRequestProperty("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); } String protocol = url.getProtocol(); if (!protocol.equals("http")) throw new UnknownServiceException("unknown protocol"); String host = url.getHost(); int port = url.getPort(); if (port == -1) port = 80; String file = url.getFile();
socket = new Socket(host, port); out = socket.getOutputStream(); PrintStream pout = new PrintStream(out);
String method; if (usePost) { method = "POST"; setRequestProperty("Content-type", "application/x-www-form-urlencoded"); int len = getPostDataLength(); setRequestProperty("Content-length", String.valueOf(getPostDataLength()));
} else method = "GET"; if (getGetDataLength() > 0) { file += "?" + getGetDataString(); } pout.println(method + " " + file + " HTTP/1.0");
for (int i = 0; i < reqHeaderNames.size(); ++i) { String name = (String) reqHeaderNames.elementAt(i); String value = (String) reqHeaderValues.elementAt(i); pout.println(name + ": " + value); } pout.println(""); if (usePost) { String ttt = getPostDataString(); pout.println(getPostDataString()); }
pout.flush();
connected = true; } /** * Insert the method's description here. * Creation date: (2001-8-25 2:06:07) * @return boolean * @exception java.lang.IllegalStateException The exception description. */ public boolean contentIsText() throws IOException { String type = getContentType(); if (type.startsWith("text")) return true; return false; } /** * Insert the method's description here. * Creation date: (2001-8-25 2:20:31) * @return byte[] */ public byte[] getByteArray() throws IOException { DataInputStream din = new DataInputStream(getInputStream());
byte[] ret; byte[] b = new byte[1024]; int off = 0, len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = din.read(b, off, 1024)) > 0) { bos.write(b, 0, len); if (len < 1024) break; } bos.flush(); bos.close(); return bos.toByteArray(); } // Gets the content length.Returns -1 if not known. public int getContentLength() throws IOException { return getHeaderFieldInt("content-length", -1); } /// Gets the content type.Returns null if not known. public String getContentType() throws IOException { return getHeaderField("content-type"); } /** * Insert the method's description here. * Creation date: (2001-8-25 1:18:23) * @return java.lang.String */ public int getGetDataLength() { return getGetDataString().length(); } /** * Insert the method's description here. * Creation date: (2001-8-25 1:18:23) * @return java.lang.String */ public String getGetDataString() { StringBuffer buf = new StringBuffer(); Enumeration enu = getData.keys(); while (enu.hasMoreElements()) { String key = (String) (enu.nextElement()); String value = (String) (getData.get(key)); if (buf.length() > 0) buf.append("&"); buf.append(key); buf.append("="); buf.append(URLEncoder.encode(value)); } return buf.toString(); } public String getHeaderField(String name) throws IOException { if (resHeaderNames == null) startInput(); int i = resHeaderNames.indexOf(name.toLowerCase()); if (i == -1) return null; return (String) resHeaderValues.elementAt(i); } public long getHeaderFieldDate(String name, long def) throws IOException { try { return DateFormat.getDateInstance().parse(getHeaderField(name)).getTime(); } catch (ParseException e) { throw new IOException(e.toString()); } } public int getHeaderFieldInt(String name, int def) throws IOException { try { return Integer.parseInt(getHeaderField(name)); } catch (NumberFormatException t) { return def; } } /** * Insert the method's description here. * Creation date: (2001-8-25 1:12:09) * @return java.util.Enumeration */ public Enumeration getHeaderNames() { return resHeaderNames.elements(); } public InputStream getInputStream() throws IOException { startInput(); return in; } public OutputStream getOutputStream() throws IOException { connect(); return out; } /** * Insert the method's description here. * Creation date: (2001-8-25 1:18:23) * @return java.lang.String */ public int getPostDataLength() { return getPostDataString().length(); } /** * Insert the method's description here. * Creation date: (2001-8-25 1:18:23) * @return java.lang.String */ public String getPostDataString() { StringBuffer buf = new StringBuffer(); Enumeration enu = postData.keys(); while (enu.hasMoreElements()) { String key = (String) (enu.nextElement()); String value = (String) (postData.get(key)); if (buf.length() > 0) buf.append("&"); buf.append(key); buf.append("="); buf.append(URLEncoder.encode(value)); } return buf.toString(); } public String getRequestProperty(String name) { if (connected) throw new IllegalAccessError("already connected"); int i = reqHeaderNames.indexOf(name); if (i == -1) return null; return (String) reqHeaderValues.elementAt(i); } public URL getURL() { return url; } public boolean getUseCaches() { return useCaches; } public boolean getUseHttp11() { return useHttp11; } /** * Insert the method's description here. * Creation date: (2001-8-25 1:48:15) * @return boolean */ public boolean isUsePost() { return usePost; } /** * Insert the method's description here. * Creation date: (2001-8-25 0:15:53) * @param args java.lang.String[] */ public static void main(String[] args) { try { /* URL url=new URL("http","192.168.0.3","/Post.php"); HttpConnection con=new HttpConnection(url); con.setUsePost(true); con.setUseCaches(false); //con.setRequestProperty("Connection", "Keep-Alive");
con.addGet("TextField","你好"); con.addGet("Submit", "submit");
con.connect(); //ByteArrayOutputStream bos=con.getByteArray(); byte[] ret=con.getByteArray(); System.out.println(new String(ret));
System.out.println(""); Enumeration enu=con.getHeaderNames(); while (enu.hasMoreElements()) { String headerName=(String)(enu.nextElement()); System.out.println(headerName+": "+con.getHeaderField(headerName)); } con.close(); */
URL url = new URL("http", "192.168.0.3", "/codemaker/IMAGES/BO.GIF"); HttpConnection con = new HttpConnection(url); con.connect();
FileOutputStream fos = new FileOutputStream("d:\\bo.gif"); fos.write(con.getByteArray()); fos.flush(); fos.close();
System.out.println(""); Enumeration enu = con.getHeaderNames(); while (enu.hasMoreElements()) { String headerName = (String) (enu.nextElement()); System.out.println(headerName + ": " + con.getHeaderField(headerName)); } con.close();
} catch (Exception e) { e.printStackTrace(); } } /** * Insert the method's description here. * Creation date: (2001-8-25 1:16:52) * @param name java.lang.String * @param value java.lang.String */ public void removeGet(String name) { getData.remove(name); } /** * Insert the method's description here. * Creation date: (2001-8-25 1:16:52) * @param name java.lang.String * @param value java.lang.String */ public void removePost(String name) { postData.remove(name); } public void setRequestProperty(String name, String value) { if (connected) throw new IllegalAccessError("already connected"); reqHeaderNames.addElement(name); reqHeaderValues.addElement(value); } public void setUseCaches(boolean useCaches) { if (connected) throw new IllegalAccessError("already connected"); this.useCaches = useCaches; } public void setUseHttp11(boolean useHttp11) { if (connected) throw new IllegalAccessError("already connected"); this.useHttp11 = useHttp11; } /** * Insert the method's description here. * Creation date: (2001-8-25 1:48:15) * @param newUsePost boolean */ public void setUsePost(boolean newUsePost) { if (connected) throw new IllegalAccessError("already connected"); usePost = newUsePost; } private void startInput() throws IOException { connect(); if (inputStarted) return; in = socket.getInputStream(); resHeaderNames = new Vector(); resHeaderValues = new Vector(); DataInputStream din = new DataInputStream(in); String line;
// Read and ignore the status line. line = din.readLine(); // Read and save the header lines. while (true) { line = din.readLine(); if (line == null || line.length() == 0) break; int colonBlank = line.indexOf(": "); if (colonBlank != -1) { String name = line.substring(0, colonBlank); String value = line.substring(colonBlank + 2); resHeaderNames.addElement(name.toLowerCase()); resHeaderValues.addElement(value); } }
inputStarted = true; } /** * Returns a String that represents the value of this object. * @return a string representation of the receiver */ public String toString() { // Insert code to print the receiver here. // This implementation forwards the message to super. You may replace or supplement this. return this.getClass().getName() + ":" + url; } }
|