package test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Arrays; public class SocketProxy { /** * @param args */ public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8080); while (true) { Socket socket = null; try { socket = serverSocket.accept(); new SocketThread(socket).start(); } catch (Exception e) { e.printStackTrace(); } } } } class SocketThread extends Thread { private Socket socketIn; private InputStream isIn; private OutputStream osIn; // private Socket socketOut; private InputStream isOut; private OutputStream osOut; public SocketThread(Socket socket) { this.socketIn = socket; } private byte[] buffer = new byte[4096]; // private static final byte[] VER = { 0x5, 0x0 }; // private static final byte[] CONNECT_OK = { 0x5, 0x0, 0x0, 0x1, 0, 0, 0, 0, 0, 0 }; private static final byte[] VER = { 5, 0}; private static final byte[] CONNECT_OK = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; static{ System.out.println(Arrays.toString(VER)); System.out.println(Arrays.toString(CONNECT_OK)); } public void run() { try { System.out.println("\n\na client connect " + socketIn.getInetAddress() + ":" + socketIn.getPort()); isIn = socketIn.getInputStream(); osIn = socketIn.getOutputStream(); int len = isIn.read(buffer); System.out.println("< " + bytesToHexString(buffer, 0, len)); osIn.write(VER); osIn.flush(); System.out.println("> " + bytesToHexString(VER, 0, VER.length)); len = isIn.read(buffer); System.out.println("< " + bytesToHexString(buffer, 0, len)); // 查找主机和端口 String host = findHost(buffer, 4, 7); int port = findPort(buffer, 8, 9); System.out.println("host=" + host + ",port=" + port); socketOut = new Socket(host, port); isOut = socketOut.getInputStream(); osOut = socketOut.getOutputStream(); // for (int i = 4; i <= 9; i++) { CONNECT_OK[i] = buffer[i]; } osIn.write(CONNECT_OK); osIn.flush(); System.out.println("> " + bytesToHexString(CONNECT_OK, 0, CONNECT_OK.length)); SocketThreadOutput out = new SocketThreadOutput(isIn, osOut); out.start(); SocketThreadInput in = new SocketThreadInput(isOut, osIn); in.start(); out.join(); in.join(); } catch (Exception e) { System.out.println("a client leave"); } finally { try { if (socketIn != null) { socketIn.close(); } } catch (IOException e) { e.printStackTrace(); } } System.out.println("socket close"); } public static String findHost(byte[] bArray, int begin, int end) { StringBuffer sb = new StringBuffer(); for (int i = begin; i <= end; i++) { sb.append(Integer.toString(0xFF & bArray[i])); sb.append("."); } sb.deleteCharAt(sb.length() - 1); return sb.toString(); } public static int findPort(byte[] bArray, int begin, int end) { int port = 0; for (int i = begin; i <= end; i++) { port <<= 16; port += bArray[i]; } return port; } // 4A 7D EB 69 // 74 125 235 105 public static final String bytesToHexString(byte[] bArray, int begin, int end) { StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i = begin; i < end; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); sb.append(" "); } return sb.toString(); } } class SocketThreadInput extends Thread { private InputStream isOut; private OutputStream osIn; public SocketThreadInput(InputStream isOut, OutputStream osIn) { this.isOut = isOut; this.osIn = osIn; } private byte[] buffer = new byte[409600]; public void run() { try { int len; while ((len = isOut.read(buffer)) != -1) { if (len > 0) { System.out.println(new String(buffer, 0, len)); osIn.write(buffer, 0, len); osIn.flush(); } } } catch (Exception e) { System.out.println("SocketThreadInput leave"); } } } class SocketThreadOutput extends Thread { private InputStream isIn; private OutputStream osOut; public SocketThreadOutput(InputStream isIn, OutputStream osOut) { this.isIn = isIn; this.osOut = osOut; } private byte[] buffer = new byte[409600]; public void run() { try { int len; while ((len = isIn.read(buffer)) != -1) { if (len > 0) { // System.out.println(new String(buffer, 0, len)); osOut.write(buffer, 0, len); osOut.flush(); } } } catch (Exception e) { System.out.println("SocketThreadOutput leave"); } } }
/*
代码是摘取别人的,我测试了一下火狐可以用 但是 findHost 方法获取端口有问题,80端口没有问题 如果是:9999,8978 ....等等会有问题 socket发送过来的是 长度为10的byte数组 IP: byte[4-8]字节转字符串用 . 分割就可以了 xx.xx.xx.xx 端口不知道是怎么转换的例如9999,字节数组byte[9-10] 就是 39,15 端口问题尝试看看一下连接 http://ethen.iteye.com/blog/783338 原文连接: http://www.open-open.com/lib/view/open1344004339456.html */
相关推荐
套接字代理一个简单的 Java 多线程 Socket 代理服务器。 它侦听传入的连接并将任何通信转发到服务器,同时记录整个对话。套接字代理服务器这是库的主类。 它可以由第三方实例化,并提供本地端口和服务器的远程主机/...
java实现的代理程序(socket\ftp 主动模式\) 配置程序在cfgs下
这是一款http代理服务器,是用java实现的socket编程,实现代理,过滤的功能
Websocket反向代理的Java实现。 与描述的方法类似,但使用Java实现。 这在Java应用程序服务器(例如Spring Boot)中可能很有用。 在根级别有一些nodejs脚本,可用于模仿验证代理服务器所需的功能。 常见的是脚本,...
socket通信nio模式有很多实现方式,但是在性能上、资源上一般很少考虑,这里封装了一个性能极强的程序。
代理服务器的java版本,有简单易懂的源代码,有详细解释,对于想学习代理服务器和socket的同学很有用。
实现一个基本的webProxy Cache,java代码,默认字符集请改为utf-8,目前只能缓存本地web服务器上的网页,图片。
java原生实现的RPC框架,使用技术:JDK动态代理、Socket通信(BIO方式)、反射、注解、Java序列化
在实现过程中,我们将采用Java语言和Socket编程技术,借助第三方库实现HTTP协议的解析和封装,同时使用多线程技术实现并发处理。具体实现包括: 1. 建立Socket连接,监听客户端请求。 2. 解析HTTP请求报文,获取...
比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化 1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。 2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,...
mail 案例5 从Mail Server删除一条消息 案例6 在Java程序中实现FTP的功能 案例7 一个最简单的聊天程序 案例8 代理服务器的实现 第十章 Java综合实例 案例1 用Java实现zip压缩解压缩 ...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
5.JdbcConn.java java jdbc连接oracle/mysql 6.NioFile.java nio操作文件读写 7.ImageThumbnail.java 生成图片缩略图 8.JsonObjs.java json简单操作 9.HttpProxy.java 代理设置 10.CaptureScreen.java 截取桌面 ...
使用idea的maven工程创建,分为服务端和客户端,涉及到的技术有以下: 1、socket通信 2、通过注解的方式发布服务。 3、支持多版本的实现。...4、java动态代理。 5、Spring的启动。 6、线程池的使用
1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的区别 1.11 Java变量类型间的相互转换 2 JAVA与WEB 2.1 JMX规范 2.1.1 JMX概述 2.1.2 设备层(Instrumentation Level) 2.1.3 代理层 2.1.4 分布服务层 ...
代理服务器,ProxyServer.java; telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chat...
它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用API。本书有很多示例,包含了几千行可以实际工作的代码(所有代码都可以在线获得),实现了功能...
java中如何实现代理机制 死锁的产生和预防 序列化 和 反序列化 json 和 xml 的区别 接口和抽象类的区别: 反射机制 泛型类 数据库连接池 java 源码分析(集合&框架) 运行时数据区域 内存溢出 垃圾回收 垃圾收集器 类...
它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用API。本书有很多示例,包含了几千行可以实际工作的代码(所有代码都可以在线获得),实现了功能...