Java Socket應(yīng)答與HTTP服務(wù)器的瓜葛
Java Socket應(yīng)答一直伴隨著我們的編程生活,在不斷的發(fā)展中有很多知識需要我們學(xué)習(xí)。下面我們就先來看看有關(guān)Java Socket應(yīng)答的代碼,有點長,但是看下去就會讓你豁然開朗。
HTTP/1.1表示這個HTTP服務(wù)器是1.1版,200是服務(wù)器對客戶請求的應(yīng)答狀態(tài)碼,OK是對應(yīng)答狀態(tài)碼的解釋,之后是這個文檔的元信息和文檔正文。(相關(guān)應(yīng)答狀態(tài)碼和元信息的解釋請參閱Inetrnet標(biāo)準(zhǔn)草案:RFC2616)。
- Http.java
- import java.net.*;
- import java.io.*;
- import java.util.Properties;
- import java.util.Enumeration;
- public class Http {
- protected Socket client;
- protected BufferedOutputStream sender;
- protected BufferedInputStream receiver;
- protected ByteArrayInputStream byteStream;
- protected URL target;
- private int responseCode=-1;
- private String responseMessage="";
- private String serverVersion="";
- private Properties header = new Properties();
- public Http() { }
- public Http(String url) {
- GET(url) ;
- }
- /* GET方法根據(jù)URL,會請求文件、數(shù)據(jù)庫查詢結(jié)果、程序運行結(jié)果等多種內(nèi)容 */
- public void GET(String url) {
- try {
- checkHTTP(url);
- openServer(target.getHost(),target.getPort() );
- String cmd = "GET "+ getURLFormat(target) +" HTTP/1.0\r\n"
- + getBaseHeads()+"\r\n";
- sendMessage(cmd);
- receiveMessage();
- } catch(ProtocolException p) {
- p.printStackTrace();
- return;
- } catch(UnknownHostException e) {
- e.printStackTrace();
- return;
- } catch(IOException i) {
- i.printStackTrace();
- return;
- }
- }
- /*
- * HEAD方法只請求URL的元信息,不包括URL本身。若懷疑本機和服務(wù)器上的
- * 文件相同,用這個方法檢查最快捷有效。
- */
- public void HEAD(String url) {
- try {
- checkHTTP(url);
- openServer(target.getHost(),target.getPort() );
- String cmd = "HEAD "+getURLFormat(target)+" HTTP/1.0\r\n"
- +getBaseHeads()+"\r\n";
- sendMessage(cmd);
- receiveMessage();
- }catch(ProtocolException p) {
- p.printStackTrace();
- return;
- }catch(UnknownHostException e) {
- e.printStackTrace();
- return;
- }catch(IOException i) {
- i.printStackTrace();
- return;
- }
- }
- /*
- * POST方法是向服務(wù)器傳送數(shù)據(jù),以便服務(wù)器做出相應(yīng)的處理。例如網(wǎng)頁上常用的
- * 提交表格。
- */
- public void POST(String url,String content) {
- try {
- checkHTTP(url);
- openServer(target.getHost(),target.getPort() );
- String cmd = "POST "+ getURLFormat(target) +"HTTP/1.0\r\n"+getBaseHeads();
- cmd += "Content-type: application/x-www-form-urlencoded\r\n";
- cmd += "Content-length: " + content.length() + "\r\n\r\n";
- cmd += content+"\r\n";
- sendMessage(cmd);
- receiveMessage();
- }catch(ProtocolException p) {
- p.printStackTrace();
- return;
- }catch(UnknownHostException e) {
- e.printStackTrace();
- return;
- }catch(IOException i) {
- i.printStackTrace();
- return;
- }
- }
- protected void checkHTTP(String url) throws ProtocolException {
- try {
- URL target = new URL(url);
- if(target==null || !target.getProtocol().toUpperCase().equals("HTTP") )
- throw new ProtocolException("這不是HTTP協(xié)議");
- this.target = target;
- } catch(MalformedURLException m) {
- throw new ProtocolException("協(xié)議格式錯誤");
- }
- }
- /*
- * 與Web服務(wù)器連接。若找不到Web服務(wù)器,InetAddress會引發(fā)UnknownHostException
- * 異常。若Socket連接失敗,會引發(fā)IOException異常。
- */
- protected void openServer(String host,int port) throws
- UnknownHostException,IOException {
- header.clear();
- responseMessage=""; responseCode=-1;
- try {
- if(client!=null) closeServer();
- if(byteStream != null) {
- byteStream.close(); byteStream=null;
- }
- InetAddress address = InetAddress.getByName(host);
- client = new Socket(address,port==-1?80:port);
- sender = new BufferedOutputStream(client.getOutputStream());
- receiver = new BufferedInputStream(client.getInputStream());
- }catch(UnknownHostException u) {
- throw u;
- }catch(IOException i) {
- throw i;
- }
- }
- /* 關(guān)閉與Web服務(wù)器的連接 */
- protected void closeServer() throws IOException {
- if(client==null) return;
- try {
- client.close(); sender.close(); receiver.close();
- } catch(IOException i) {
- throw i;
- }
- client=null; sender=null; receiver=null;
- }
- protected String getURLFormat(URL target) {
- String spec = "http://
- +target.getHost();
- if(target.getPort()!=-1)
- spec+=":"+target.getPort();
- return spec+=target.getFile();
- }
- /* 向Web服務(wù)器傳送數(shù)據(jù) */
- protected void sendMessage(String data) throws IOException{
- sender.write(data.getBytes(),0,data.length());
- sender.flush();
- }
- /* 接收來自Web服務(wù)器的數(shù)據(jù) */
- protected void receiveMessage() throws IOException{
- byte data[] = new byte[1024];
- int count=0;
- int word=-1;
- // 解析***行
- while( (word=receiver.read())!=-1 ) {
- if(word=='\r'||word=='\n') {
- word=receiver.read();
- if(word=='\n') word=receiver.read();
- break;
- }
- if(count == data.length) data = addCapacity(data);
- data[count++]=(byte)word;
- }
- String message = new String(data,0,count);
- int mark = message.indexOf(32);
- serverVersion = message.substring(0,mark);
- while( mark<message.length() && message.charAt(mark+1)==32 ) mark++;
- responseCode = Integer.parseInt(message.substring(mark+1,mark+=4));
- responseMessage = message.substring(mark,message.length()).trim();
- // 應(yīng)答狀態(tài)碼和處理請讀者添加
- switch(responseCode) {
- case 400:
- throw new IOException("錯誤請求");
- case 404:
- throw new FileNotFoundException( getURLFormat(target) );
- case 503:
- throw new IOException("服務(wù)器不可用" );
- }
- if(word==-1) throw new ProtocolException("信息接收異常終止");
- int symbol=-1;
- count=0;
- // 解析元信息
- while( word!='\r' && word!='\n' && word>-1) {
- if(word=='\t') word=32;
- if(count==data.length) data = addCapacity(data);
- data[count++] = (byte)word;
- parseLine: {
- while( (symbol=receiver.read()) >-1 ) {
- switch(symbol) {
- case '\t':
- symbol=32; break;
- case '\r':
- case '\n':
- word = receiver.read();
- if( symbol=='\r' && word=='\n') {
- word=receiver.read();
- if(word=='\r') word=receiver.read();
- }
- if( word=='\r' || word=='\n' || word>32) break parseLine;
- symbol=32; break;
- }
- if(count==data.length) data = addCapacity(data);
- data[count++] = (byte)symbol;
- }
- word=-1;
- }
- message = new String(data,0,count);
- mark = message.indexOf(':');
- String key = null;
- if(mark>0) key = message.substring(0,mark);
- mark++;
- while( mark<message.length() && message.charAt(mark)<=32 ) mark++;
- String value = message.substring(mark,message.length() );
- header.put(key,value);
- count=0;
- }
- // 獲得正文數(shù)據(jù)
- while( (word=receiver.read())!=-1) {
- if(count == data.length) data = addCapacity(data);
- data[count++] = (byte)word;
- }
- if(count>0) byteStream = new ByteArrayInputStream(data,0,count);
- data=null;
- closeServer();
- }
- public String getResponseMessage() {
- return responseMessage;
- }
- public int getResponseCode() {
- return responseCode;
- }
- public String getServerVersion() {
- return serverVersion;
- }
- public InputStream getInputStream() {
- return byteStream;
- }
- public synchronized String getHeaderKey(int i) {
- if(i>=header.size()) return null;
- Enumeration enum = header.propertyNames();
- String key = null;
- for(int j=0; j<=i; j++)
- key = (String)enum.nextElement();
- return key;
- }
- public synchronized String getHeaderValue(int i) {
- if(i>=header.size()) return null;
- return header.getProperty(getHeaderKey(i));
- }
- public synchronized String getHeaderValue(String key) {
- return header.getProperty(key);
- }
- protected String getBaseHeads() {
- String inf = "User-Agent: myselfHttp/1.0\r\n"+
- "Accept: www/source; text/html; image/gif; */*\r\n";
- return inf;
- }
- private byte[] addCapacity(byte rece[]){
- byte temp[] = new byte[rece.length+1024];
- System.arraycopy(rece,0,temp,0,rece.length);
- return temp;
- }
- public static void main(String[] args) {
- Http http=new Http();
- //http.GET("http://192.168.1.5
- );
- int i;
- for (i=0; i<50000; i++) {
- http.GET("http://www.model-dl.com/modelinfo.asp?modelid=101 );
- http.POST("http://www.model-dl.com/modelinfo.asp?modelid=101,"ratecontd=101&MM_insert=form1 ");
- }
- }
- }
以上就是對Java Socket應(yīng)答的相關(guān)介紹,希望大家有所發(fā)現(xiàn)。
【編輯推薦】