diff --git a/README.md b/README.md index f746d3f..c9b024b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ lanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿 ### 相关地址 - 主页 https://lanproxy.thingsglobal.org +- lanproxy-go-client https://github.com/ffay/lanproxy-go-client - 发布包下载地址 https://github.com/ffay/lanproxy/releases ### 实现方案 @@ -84,9 +85,9 @@ server.port=4993 #### 运行 - 一台内网pc或服务器(运行proxy-client);一台公网服务器(运行proxy-server) -- 安装java1.8运行环境 -- linux(mac)环境中运行bin目录下的 startup.sh -- windows环境中运行bin目录下的 startup.bat + -安装java1.8运行环境 + -linux(mac)环境中运行bin目录下的 startup.sh + -windows环境中运行bin目录下的 startup.bat #### 其他 diff --git a/proxy-client/src/main/java/org/fengfei/lanproxy/client/ClientChannelMannager.java b/proxy-client/src/main/java/org/fengfei/lanproxy/client/ClientChannelMannager.java index 6a3e3a1..c8a6385 100644 --- a/proxy-client/src/main/java/org/fengfei/lanproxy/client/ClientChannelMannager.java +++ b/proxy-client/src/main/java/org/fengfei/lanproxy/client/ClientChannelMannager.java @@ -16,7 +16,6 @@ import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelOption; import io.netty.util.AttributeKey; /** @@ -109,37 +108,6 @@ public class ClientChannelMannager { return realServerChannel.attr(CLIENT_CHANNEL_WRITEABLE).get() && realServerChannel.attr(USER_CHANNEL_WRITEABLE).get(); } - public static void setRealServerChannelReadability(Channel realServerChannel, Boolean client, Boolean user) { - logger.debug("update real server channel readability, {} {} {}", realServerChannel, client, user); - if (realServerChannel == null) { - return; - } - - if (client != null) { - realServerChannel.attr(CLIENT_CHANNEL_WRITEABLE).set(client); - } - - if (user != null) { - realServerChannel.attr(USER_CHANNEL_WRITEABLE).set(user); - } - - if (realServerChannel.attr(CLIENT_CHANNEL_WRITEABLE).get() && realServerChannel.attr(USER_CHANNEL_WRITEABLE).get()) { - realServerChannel.config().setOption(ChannelOption.AUTO_READ, true); - } else { - realServerChannel.config().setOption(ChannelOption.AUTO_READ, false); - } - } - - // public static void notifyChannelWritabilityChanged(Channel channel) { - // logger.debug("channel writability changed, {}", channel.isWritable()); - // Iterator> entryIte = - // realServerChannels.entrySet().iterator(); - // while (entryIte.hasNext()) { - // setRealServerChannelReadability(entryIte.next().getValue(), - // channel.isWritable(), null); - // } - // } - public static void clearRealServerChannels() { logger.warn("channel closed, clear real server channels"); diff --git a/proxy-client/src/main/java/org/fengfei/lanproxy/client/handlers/ClientChannelHandler.java b/proxy-client/src/main/java/org/fengfei/lanproxy/client/handlers/ClientChannelHandler.java index 74c538f..e2d8aa4 100644 --- a/proxy-client/src/main/java/org/fengfei/lanproxy/client/handlers/ClientChannelHandler.java +++ b/proxy-client/src/main/java/org/fengfei/lanproxy/client/handlers/ClientChannelHandler.java @@ -16,6 +16,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; /** @@ -52,23 +53,11 @@ public class ClientChannelHandler extends SimpleChannelInboundHandler CHANNEL_CLIENT_KEY = AttributeKey.newInstance("channel_client_key"); - private static final AttributeKey PROXY_CHANNEL_WRITEABLE = AttributeKey.newInstance("proxy_channel_writeable"); - - private static final AttributeKey REAL_BACKEND_SERVER_CHANNEL_WRITEABLE = AttributeKey.newInstance("real_backend_server_channel_writeable"); - private static Map portCmdChannelMapping = new ConcurrentHashMap(); private static Map cmdChannels = new ConcurrentHashMap(); @@ -293,32 +288,4 @@ public class ProxyChannelManager { return cmdChannel.attr(USER_CHANNELS).get(); } - /** - * 更新用户连接是否可写状态 - * - * @param userChannel - * @param client - * @param proxy - */ - public static void setUserChannelReadability(Channel userChannel, Boolean realBackendServerChannelWriteability, Boolean proxyChannelWriteability) { - logger.debug("update user channel readability, {} {} {}", userChannel, realBackendServerChannelWriteability, proxyChannelWriteability); - synchronized (userChannel) { - if (realBackendServerChannelWriteability != null) { - userChannel.attr(REAL_BACKEND_SERVER_CHANNEL_WRITEABLE).set(realBackendServerChannelWriteability); - } - - if (proxyChannelWriteability != null) { - userChannel.attr(PROXY_CHANNEL_WRITEABLE).set(proxyChannelWriteability); - } - - if (userChannel.attr(REAL_BACKEND_SERVER_CHANNEL_WRITEABLE).get() && userChannel.attr(PROXY_CHANNEL_WRITEABLE).get()) { - - // 代理客户端与后端服务器连接状态均为可写时,用户连接状态为可读 - userChannel.config().setOption(ChannelOption.AUTO_READ, true); - } else { - userChannel.config().setOption(ChannelOption.AUTO_READ, false); - } - } - } - } diff --git a/proxy-server/src/main/java/org/fengfei/lanproxy/server/handlers/ServerChannelHandler.java b/proxy-server/src/main/java/org/fengfei/lanproxy/server/handlers/ServerChannelHandler.java index f694d12..9085956 100644 --- a/proxy-server/src/main/java/org/fengfei/lanproxy/server/handlers/ServerChannelHandler.java +++ b/proxy-server/src/main/java/org/fengfei/lanproxy/server/handlers/ServerChannelHandler.java @@ -14,6 +14,7 @@ import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; /** @@ -44,25 +45,11 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler { String userId = newUserId(); String lanInfo = ProxyConfig.getInstance().getLanInfo(sa.getPort()); // 用户连接到代理服务器时,设置用户连接不可读,等待代理后端服务器连接成功后再改变为可读状态 - ProxyChannelManager.setUserChannelReadability(userChannel, false, false); + userChannel.config().setOption(ChannelOption.AUTO_READ, false); ProxyChannelManager.addUserChannelToCmdChannel(cmdChannel, userId, userChannel); ProxyMessage proxyMessage = new ProxyMessage(); proxyMessage.setType(ProxyMessage.TYPE_CONNECT); @@ -120,14 +121,10 @@ public class UserChannelHandler extends SimpleChannelInboundHandler { // 该端口还没有代理客户端 ctx.channel().close(); } else { - - // 通知代理客户端,用户连接可写状态 - String userId = ProxyChannelManager.getUserChannelUserId(userChannel); - ProxyMessage proxyMessage = new ProxyMessage(); - proxyMessage.setType(ProxyMessage.C_TYPE_WRITE_CONTROL); - proxyMessage.setUri(userId); - proxyMessage.setData(userChannel.isWritable() ? new byte[] { 0x01 } : new byte[] { 0x00 }); - cmdChannel.writeAndFlush(proxyMessage); + Channel proxyChannel = userChannel.attr(Constants.NEXT_CHANNEL).get(); + if (proxyChannel != null) { + proxyChannel.config().setOption(ChannelOption.AUTO_READ, userChannel.isWritable()); + } } super.channelWritabilityChanged(ctx); diff --git a/proxy-server/src/main/resources/startup.sh b/proxy-server/src/main/resources/startup.sh index 874b7b0..15a77f8 100644 --- a/proxy-server/src/main/resources/startup.sh +++ b/proxy-server/src/main/resources/startup.sh @@ -7,7 +7,7 @@ LOGS_DIR=$DEPLOY_DIR/logs APP_MAINCLASS=org.fengfei.lanproxy.server.ProxyServerContainer -PIDS=`ps -ef | grep java | grep "$CONF_DIR" |awk '{print $2}'` +PIDS=`ps -ef | grep -v grep | grep "$CONF_DIR" |awk '{print $2}'` if [ -n "$PIDS" ]; then echo "ERROR: already started!" echo "PID: $PIDS" diff --git a/proxy-server/src/main/resources/stop.sh b/proxy-server/src/main/resources/stop.sh index ab16854..05db1ac 100644 --- a/proxy-server/src/main/resources/stop.sh +++ b/proxy-server/src/main/resources/stop.sh @@ -9,7 +9,7 @@ if [ ! -d $LOGS_DIR ]; then fi STDOUT_FILE=$LOGS_DIR/stdout.log -PID=`ps -ef | grep java | grep "$DEPLOY_DIR/conf" | awk '{print $2}'` +PID=`ps -ef | grep -v grep | grep "$DEPLOY_DIR/conf" | awk '{print $2}'` echo "PID: $PID" if [ -z "$PID" ]; then echo "ERROR: The proxy server does not started!" diff --git a/proxy-server/src/test/resources/log4j.properties b/proxy-server/src/test/resources/log4j.properties index f421762..04a8097 100644 --- a/proxy-server/src/test/resources/log4j.properties +++ b/proxy-server/src/test/resources/log4j.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=debug,stdout +log4j.rootLogger=info,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout