⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserverconnection.java

📁 一个可以在applet窗体上持行sql语句并显示返回结果的程序
💻 JAVA
字号:
/*
 * WebServerConnection.java
 */

package org.hsql;
import java.net.*;
import java.io.*;
import java.util.*;

class WebServerConnection extends Thread {
  final static String ENCODING="8859_1";
  private Socket mSocket;
  private WebServer mServer;
  private final static int GET=1,HEAD=2,POST=3,
  BAD_REQUEST=400,FORBIDDEN=403,NOT_FOUND=404;

  WebServerConnection(Socket socket,WebServer server) {
    mServer=server;
    mSocket=socket;
  }
  public void run() {
    try {
      BufferedReader input=new BufferedReader(
      new InputStreamReader(mSocket.getInputStream(),ENCODING));
      String request,name=null;
      int method=BAD_REQUEST;
      int len=-1;
      while(true) {
        request=input.readLine();
        if(request==null) {
          break;
        }
        StringTokenizer tokenizer=new StringTokenizer(request," ");
        if(!tokenizer.hasMoreTokens()) {
          break;
        }
        String first=tokenizer.nextToken();
        if(first.equals("GET")) {
          method=GET;
          name=tokenizer.nextToken();
        } else if(first.equals("HEAD")) {
          method=HEAD;
          name=tokenizer.nextToken();
        } else if(first.equals("POST")) {
          method=POST;
          name=tokenizer.nextToken();
        } else if(request.toUpperCase().startsWith("CONTENT-LENGTH:")) {
          len=Integer.parseInt(tokenizer.nextToken());
        }
      }
      switch(method) {
      case BAD_REQUEST:
        processError(BAD_REQUEST);
        break;
      case GET:
        processGet(name,true);
        break;
      case HEAD:
        processGet(name,false);
        break;
      case POST:
        processPost(input,name,len);
        break;
      }
      input.close();
    } catch(Exception e) {
    }
  }
  private void processGet(String name,boolean send) {
    try {
      if(name.endsWith("/")) {
        name=name+mServer.mDefaultFile;
      }
      if(name.indexOf("..")!=-1) {
        processError(FORBIDDEN);
        return;
      }
      name=mServer.mRoot+name;
      if(mServer.mPathSeparatorChar!='/') {
        name=name.replace('/',mServer.mPathSeparatorChar);
      }
      String mime=null;
      int i=name.lastIndexOf(".");
      if(i!=-1) {
        String ending=name.substring(i).toLowerCase();
        mime=(String)mServer.mProperties.getProperty(ending);
      }
      if(mime==null) {
        mime="text/html";
      }
      BufferedInputStream file=null;
      String header;
      try {
        file=new BufferedInputStream(new FileInputStream(new File(name)));
        int len=file.available();
        header=getHead("HTTP/1.0 200 OK",
        "Content-Type: "+mime+"\n"+
        "Content-Length: "+len);
      } catch(IOException e) {
        processError(NOT_FOUND);
        return;
      }
      DataOutputStream output=new DataOutputStream(new BufferedOutputStream(
      mSocket.getOutputStream()));
      output.write(header.getBytes(ENCODING));
      if(send) {
        int b;
        while(true) {
          b=file.read();
          if(b==-1) {
            break;
          }
          output.writeByte(b);
        }
      }
      output.flush();
      output.close();
    } catch(Exception e) {
      mServer.traceError("processGet: "+e.getMessage());
    }
  }
  private String getHead(String start,String end) {
    return start+"\nAllow: GET, HEAD, POST\nMIME-Version: 1.0\n"+
    "Server: "+mServer.mServerName+"\n"+end+"\n\n";
  }
  private void processPost(BufferedReader input,String name,int len) {
    if(len<0) {
      processError(BAD_REQUEST);
      return;
    }
    char b[]=new char[len];
    try {
      input.read(b,0,len);
    } catch(IOException e) {
      processError(BAD_REQUEST);
      return;
    }
    String s=new String(b);
    int p=s.indexOf('+');
    int q=s.indexOf('+',p+1);
    if(p==-1 || q==-1) {
      processError(BAD_REQUEST);
      return;
    }
    String user=s.substring(0,p);
    user=StringConverter.hexStringToUnicode(user);
    String password=s.substring(p+1,q);
    password=StringConverter.hexStringToUnicode(password);
    s=s.substring(q+1);
    s=StringConverter.hexStringToUnicode(s);
    processQuery(user,password,s);
  }
  private void processError(int code) {
    mServer.trace("processError "+code);
    String message=null;
    switch(code) {
    case BAD_REQUEST:
      message=getHead("HTTP/1.0 400 Bad Request","")+
      "<HTML><BODY><H1>Bad Request</H1>"+
      "The server could not understand this request.<P></BODY></HTML>";
      break;
    case NOT_FOUND:
      message=getHead("HTTP/1.0 404 Not Found","")+
      "<HTML><BODY><H1>Not Found</H1>"+
      "The server could not find this file.<P></BODY></HTML>";
      break;
    case FORBIDDEN:
      message=getHead("HTTP/1.0 403 Forbidden","")+
      "<HTML><BODY><H1>Forbidden</H1>"+
      "Access is not allowed.<P></BODY></HTML>";
      break;
    }
    try {
      DataOutputStream output=new DataOutputStream(new BufferedOutputStream(
      mSocket.getOutputStream()));
      output.write(message.getBytes(ENCODING));
      output.flush();
      output.close();
    } catch(Exception e) {
      mServer.traceError("processError: "+e.getMessage());
    }
  }
  private void processQuery(String user,String password,String statement) {
    try {
      mServer.trace(statement);
      byte result[]=mServer.mDatabase.execute(user,password,statement);
      int len=result.length;
      String header=getHead("HTTP/1.0 200 OK",
      "Content-Type: application/octet-stream\n"+
      "Content-Length: "+len);
      DataOutputStream output=new DataOutputStream(new BufferedOutputStream(
      mSocket.getOutputStream()));
      output.write(header.getBytes(ENCODING));
      output.write(result);
      output.flush();
      output.close();
    } catch(Exception e) {
      mServer.traceError("processQuery: "+e.getMessage());
    }
    // System.out.print("Queries processed: "+(iQueries++)+"  \r");
    if(mServer.mDatabase.isShutdown()) {
      mServer.trace("The database is shutdown");
      System.exit(0);
    }
  }
  // static private int iQueries=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -