📄 httptunnelservlet.java
字号:
package javatunnel;import java.io.*;import java.net.*;import java.util.*;import javax.servlet.http.*;/** * *JavaTunnel * *Copyright (C) 2002 Andr閟 Ederra * *This program is free software; you can redistribute it and/or *modify it under the terms of the GNU General Public License *as published by the Free Software Foundation; either version 2 *of the License, or (at your option) any later version. * *This program is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *GNU General Public License for more details. * *You should have received a copy of the GNU General Public License *along with this program; if not, write to the Free Software *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/public class HTTPTunnelServlet extends HttpServlet { static String controlHeader = "TunnelControl"; static String CONNECT = "CONNECT"; static String IN = "IN"; static String OUT = "OUT"; static String ERROR = "ERROR"; HashMap connectionList = new HashMap(); int connectionCount = 0; static final int BUFFERSIZE = 1024 * 10; private static final int WAITCYCLE = 200; public void init() { System.out.println("JavaTunnel Servlet UP!"); } /*public void service(ServletRequest req, ServletResponse resp) { System.out.println("service"); System.out.println(req.getProtocol()); System.out.println(req); Enumeration enum = req.getAttributeNames(); while (enum.hasMoreElements()) { System.out.println(enum.nextElement()); } try { ServletInputStream in = req.getInputStream(); byte[] buffer = new byte[BUFFERSIZE]; int offset = 0; int n = 0; while (n != -1) { System.out.println("pre readline"); n = in.readLine(buffer, offset, BUFFERSIZE); System.out.println("post readline"); System.out.println(new String(buffer)); offset += n; } } catch (IOException ioe) { ioe.printStackTrace(); } }*/ protected void doGet(HttpServletRequest req, HttpServletResponse resp) { executeCommand(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) { executeCommand(req, resp); } private void executeCommand( HttpServletRequest req, HttpServletResponse resp) { StringTokenizer tokenizer; String control = req.getHeader(controlHeader); if (control != null) { tokenizer = new StringTokenizer(control); //Process the command String[] commands = new String[tokenizer.countTokens()]; int i = 0; while (tokenizer.hasMoreElements()) { commands[i] = tokenizer.nextToken(); i++; } if (commands[0].equals(CONNECT)) { String connection = createConnection( commands[1], Integer.parseInt(commands[2])); resp.setHeader(controlHeader, CONNECT + " " + connection); } else if (commands[0].equals(IN)) { handleIncomingData(commands[1], req, resp); } else if (commands[0].equals(OUT)) { handleOutcomingData(commands[1], req, resp); } } else { try { resp.sendError(HttpServletResponse.SC_BAD_REQUEST); } catch (IOException ioe) { System.out.println(ioe); ioe.printStackTrace(); } } } private String createConnection(String host, int port) { try { Socket remoteSocket = new Socket(host, port); synchronized (this) { connectionCount++; connectionList.put( String.valueOf(connectionCount), remoteSocket); return String.valueOf(connectionCount); } } catch (Exception e) { System.out.println(e); e.printStackTrace(); return null; } } private void handleOutcomingData( String ticket, HttpServletRequest req, HttpServletResponse resp) { Socket outSocket = (Socket) connectionList.get(ticket); if (outSocket != null) { try { OutputStream outputStream = outSocket.getOutputStream(); byte[] buffer = new byte[BUFFERSIZE]; int n = 0; while (n != -1) { n = req.getInputStream().read(buffer); if (n != -1) { outputStream.write(buffer, 0, n); outputStream.flush(); } } OutputStream responseStream = resp.getOutputStream(); responseStream.write("OK".getBytes()); responseStream.flush(); responseStream.close(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } } else { try { OutputStream responseStream = resp.getOutputStream(); responseStream.write("ERROR".getBytes()); responseStream.flush(); responseStream.close(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } } } private void handleIncomingData( String ticket, HttpServletRequest req, HttpServletResponse resp) { Socket inSocket = (Socket) connectionList.get(ticket); if (inSocket != null) { try { InputStream inputStream = inSocket.getInputStream(); byte[] buffer = new byte[BUFFERSIZE]; int n; n = inputStream.read(buffer); while (n == -1) { try { Thread.sleep(WAITCYCLE); } catch (InterruptedException ie) { ie.printStackTrace(); } n = inputStream.read(buffer); } resp.getOutputStream().write(buffer, 0, n); resp.getOutputStream().flush(); resp.getOutputStream().close(); //} } catch (Exception e) { System.out.println(e); e.printStackTrace(); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -