Java Socket应答与HTTP服务器的瓜葛
Java Socket应答一直伴随着我们的编程生活,在不断的发展中有很多知识需要我们学习。下面我们就先来看看有关JavaSocket应答的代码,有点长,但是看下去就会让你豁然开朗。
HTTP/1.1表示这个HTTP服务器是1.1版,200是服务器对客户请求的应答状态码,OK是对应答状态码的解释,之后是这个文档的元信息和文档正文。(相关应答状态码和元信息的解释请参阅Inetrnet标准草案:RFC2616)。
- Http.java
- importjava.net.*;
- importjava.io.*;
- importjava.util.Properties;
- importjava.util.Enumeration;
- publicclassHttp{
- protectedSocketclient;
- protectedBufferedOutputStreamsender;
- protectedBufferedInputStreamreceiver;
- protectedByteArrayInputStreambyteStream;
- protectedURLtarget;
- privateintresponseCode=-1;
- privateStringresponseMessage="";
- privateStringserverVersion="";
- privatePropertiesheader=newProperties();
- publicHttp(){}
- publicHttp(Stringurl){
- GET(url);
- }
- /*GET方法根据URL,会请求文件、数据库查询结果、程序运行结果等多种内容*/
- publicvoidGET(Stringurl){
- try{
- checkHTTP(url);
- openServer(target.getHost(),target.getPort());
- Stringcmd="GET"+getURLFormat(target)+"HTTP/1.0\r\n"
- +getBaseHeads()+"\r\n";
- sendMessage(cmd);
- receiveMessage();
- }catch(ProtocolExceptionp){
- p.printStackTrace();
- return;
- }catch(UnknownHostExceptione){
- e.printStackTrace();
- return;
- }catch(IOExceptioni){
- i.printStackTrace();
- return;
- }
- }
- /*
- *HEAD方法只请求URL的元信息,不包括URL本身。若怀疑本机和服务器上的
- *文件相同,用这个方法检查最快捷有效。
- */
- publicvoidHEAD(Stringurl){
- try{
- checkHTTP(url);
- openServer(target.getHost(),target.getPort());
- Stringcmd="HEAD"+getURLFormat(target)+"HTTP/1.0\r\n"
- +getBaseHeads()+"\r\n";
- sendMessage(cmd);
- receiveMessage();
- }catch(ProtocolExceptionp){
- p.printStackTrace();
- return;
- }catch(UnknownHostExceptione){
- e.printStackTrace();
- return;
- }catch(IOExceptioni){
- i.printStackTrace();
- return;
- }
- }
- /*
- *POST方法是向服务器传送数据,以便服务器做出相应的处理。例如网页上常用的
- *提交表格。
- */
- publicvoidPOST(Stringurl,Stringcontent){
- try{
- checkHTTP(url);
- openServer(target.getHost(),target.getPort());
- Stringcmd="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(ProtocolExceptionp){
- p.printStackTrace();
- return;
- }catch(UnknownHostExceptione){
- e.printStackTrace();
- return;
- }catch(IOExceptioni){
- i.printStackTrace();
- return;
- }
- }
- protectedvoidcheckHTTP(Stringurl)throwsProtocolException{
- try{
- URLtarget=newURL(url);
- if(target==null||!target.getProtocol().toUpperCase().equals("HTTP"))
- thrownewProtocolException("这不是HTTP协议");
- this.target=target;
- }catch(MalformedURLExceptionm){
- thrownewProtocolException("协议格式错误");
- }
- }
- /*
- *与Web服务器连接。若找不到Web服务器,InetAddress会引发UnknownHostException
- *异常。若Socket连接失败,会引发IOException异常。
- */
- protectedvoidopenServer(Stringhost,intport)throws
- UnknownHostException,IOException{
- header.clear();
- responseMessage="";responseCode=-1;
- try{
- if(client!=null)closeServer();
- if(byteStream!=null){
- byteStream.close();byteStream=null;
- }
- InetAddressaddress=InetAddress.getByName(host);
- client=newSocket(address,port==-1?80:port);
- sender=newBufferedOutputStream(client.getOutputStream());
- receiver=newBufferedInputStream(client.getInputStream());
- }catch(UnknownHostExceptionu){
- throwu;
- }catch(IOExceptioni){
- throwi;
- }
- }
- /*关闭与Web服务器的连接*/
- protectedvoidcloseServer()throwsIOException{
- if(client==null)return;
- try{
- client.close();sender.close();receiver.close();
- }catch(IOExceptioni){
- throwi;
- }
- client=null;sender=null;receiver=null;
- }
- protectedStringgetURLFormat(URLtarget){
- Stringspec="http://
- +target.getHost();
- if(target.getPort()!=-1)
- spec+=":"+target.getPort();
- returnspec+=target.getFile();
- }
- /*向Web服务器传送数据*/
- protectedvoidsendMessage(Stringdata)throwsIOException{
- sender.write(data.getBytes(),0,data.length());
- sender.flush();
- }
- /*接收来自Web服务器的数据*/
- protectedvoidreceiveMessage()throwsIOException{
- bytedata[]=newbyte[1024];
- intcount=0;
- intword=-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;
- }
- Stringmessage=newString(data,0,count);
- intmark=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();
- //应答状态码和处理请读者添加
- switch(responseCode){
- case400:
- thrownewIOException("错误请求");
- case404:
- thrownewFileNotFoundException(getURLFormat(target));
- case503:
- thrownewIOException("服务器不可用");
- }
- if(word==-1)thrownewProtocolException("信息接收异常终止");
- intsymbol=-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)breakparseLine;
- symbol=32;break;
- }
- if(count==data.length)data=addCapacity(data);
- data[count++]=(byte)symbol;
- }
- word=-1;
- }
- message=newString(data,0,count);
- mark=message.indexOf(':');
- Stringkey=null;
- if(mark>0)key=message.substring(0,mark);
- mark++;
- while(mark<message.length()&&message.charAt(mark)<=32)mark++;
- Stringvalue=message.substring(mark,message.length());
- header.put(key,value);
- count=0;
- }
- //获得正文数据
- while((word=receiver.read())!=-1){
- if(count==data.length)data=addCapacity(data);
- data[count++]=(byte)word;
- }
- if(count>0)byteStream=newByteArrayInputStream(data,0,count);
- data=null;
- closeServer();
- }
- publicStringgetResponseMessage(){
- returnresponseMessage;
- }
- publicintgetResponseCode(){
- returnresponseCode;
- }
- publicStringgetServerVersion(){
- returnserverVersion;
- }
- publicInputStreamgetInputStream(){
- returnbyteStream;
- }
- publicsynchronizedStringgetHeaderKey(inti){
- if(i>=header.size())returnnull;
- Enumerationenum=header.propertyNames();
- Stringkey=null;
- for(intj=0;j<=i;j++)
- key=(String)enum.nextElement();
- returnkey;
- }
- publicsynchronizedStringgetHeaderValue(inti){
- if(i>=header.size())returnnull;
- returnheader.getProperty(getHeaderKey(i));
- }
- publicsynchronizedStringgetHeaderValue(Stringkey){
- returnheader.getProperty(key);
- }
- protectedStringgetBaseHeads(){
- Stringinf="User-Agent:myselfHttp/1.0\r\n"+
- "Accept:www/source;text/html;image/gif;*/*\r\n";
- returninf;
- }
- privatebyte[]addCapacity(byterece[]){
- bytetemp[]=newbyte[rece.length+1024];
- System.arraycopy(rece,0,temp,0,rece.length);
- returntemp;
- }
- publicstaticvoidmain(String[]args){
- Httphttp=newHttp();
- //http.GET("http://192.168.1.5
- );
- inti;
- 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应答的相关介绍,希望大家有所发现。