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 */
相关推荐
5. **关闭连接**:完成数据传输后,记得关闭所有打开的Socket和InputStream/OutputStream,以释放系统资源: ```java in.close(); out.close(); clientSocket.close(); forwardSocket.close(); serverSocket....
在Java网络编程中,Socket是实现客户端与服务器端通信的基础组件。当涉及到通过代理服务器或者负载均衡器(如Nginx)进行TCP转发时,获取用户的真实IP地址可能会变得复杂。在标题“java socket nginx tcp转发 用户...
这样,浏览器的所有HTTP请求都会通过这个本地的Socket代理进行转发。 6. **安全性与性能**: 使用自定义的代理服务器有一定的安全风险,因为它可能成为攻击者的目标。同时,由于Socket通信的开销,可能会影响网络...
总之,Java实现的代理服务器是通过Java的Socket编程接口实现的,它能帮助我们更好地理解和实践代理服务器的工作原理。通过分析`HttpProxy.java`和`SubHttpProxy.java`的代码,我们可以深入学习网络编程和代理服务器...
Java 实现的代理服务器是一种网络通信工具,它允许客户端通过该服务器作为中介与目标服务器进行交互,从而隐藏了客户端的真实身份或提供了额外的安全性。在本项目中,我们主要关注的是实现了 SOCKS4 和 SOCKS5 协议...
在Java中,可以使用`java.net.Socket`类实现FTP代理,同时,`org.apache.commons.net.ftp.FTPClient`库提供了一个强大的FTP客户端实现,可以方便地处理各种FTP操作。 **Telnet代理** Telnet是一种远程登录协议,...
在"socket通信NIO代理模式demo实例"中,你可以找到具体的代码实现,包括`Server`端和`Client`端的逻辑,以及如何使用`Selector`进行事件监听。通过对这个示例的学习,你可以深入理解NIO在代理模式中的应用,并能灵活...
Java使用传统Socket手写的远程RPC(Remote Procedure Call)框架是一种实现分布式系统中不同节点间通信的技术。RPC允许一个程序在不关心远程系统具体实现的情况下,调用另一个远程系统的功能,就像是调用本地方法...
Java的JSSE(Java Secure Socket Extension)提供了实现这些加密协议的工具。 6. 并发处理:由于邮件服务可能面临大量并发请求,Java的多线程模型和并发库(如ExecutorService和ConcurrentHashMap)能够帮助有效地...
套接字代理一个简单的 Java 多线程 Socket 代理服务器。 它侦听传入的连接并将任何通信转发到服务器,同时记录整个对话。套接字代理服务器这是库的主类。 它可以由第三方实例化,并提供本地端口和服务器的远程主机/...
Websocket反向代理的Java实现。 与描述的方法类似,但使用Java实现。 这在Java应用程序服务器(例如Spring Boot)中可能很有用。 在根级别有一些nodejs脚本,可用于模仿验证代理服务器所需的功能。 常见的是脚本,...
在这个Java实现中,我们将探讨如何构建一个简单的代理服务器,并了解涉及的关键概念和技术。 1. **Java基础知识**: - `JFrame` 是Java Swing库中的一个类,用于创建窗口应用程序的基础框架。 - `JTextArea` 是一...
这是一款http代理服务器,是用java实现的socket编程,实现代理,过滤的功能
在Java中实现HTTP代理,开发者会利用Socket编程和HTTP协议的特性来构建这样的系统。 首先,我们需要理解HTTP协议。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到...
4. **Java实现网络代理的关键步骤**: - 创建ServerSocket实例,指定监听的端口号。 - 在ServerSocket上接受来自客户端的连接,返回一个新的Socket实例。 - 读取Socket的InputStream,获取客户端发送的请求。 - ...
开发者可以使用JAX-WS来实现服务端点和服务客户端代理。 4. 示例:创建一个简单的SOAP服务,包括定义服务接口、实现接口并发布为SOAP服务,然后创建客户端调用服务。 二、Java Socket编程 1. Socket接口:Java的...
在Java中实现HTTP代理服务器,主要涉及到以下几个关键步骤和知识点: 1. **网络编程基础**:熟悉Java的Socket编程是首要的,因为HTTP通信基于TCP/IP协议,我们需要使用Socket来建立客户端和服务器之间的连接。`java...
Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...
在邮件发送系统中,客户端通常扮演的是邮件用户代理(MUA)的角色,负责创建Socket连接到邮件服务器(MDS),并将邮件数据通过这个连接发送出去。服务器端则接收这些连接并处理邮件数据。 1. **创建Socket连接**:...
### Java代理服务器的实现 #### 概述 Java代理服务器是一种网络中间件,它作为客户端与目标服务器之间的中介,能够帮助转发HTTP请求和响应。在实际应用中,代理服务器不仅能够提升安全性,还能够用于缓存、日志...