Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
G
g4proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
g4proxy
Commits
a0512be4
Commit
a0512be4
authored
Apr 16, 2019
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
报文过大,可能导致解码失败,此时使用分包策略
parent
27316b2a
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
105 additions
and
44 deletions
+105
-44
HttpProxyService.java
app/src/main/java/com/virjar/g4proxy/HttpProxyService.java
+11
-8
G4ProxyClient.java
...ain/java/com/virjar/g4proxy_new/client/G4ProxyClient.java
+3
-1
LittleProxyChannelHandler.java
.../virjar/g4proxy_new/client/LittleProxyChannelHandler.java
+28
-8
Constant.java
...c/main/java/com/virjar/g4proxy_new/protocol/Constant.java
+1
-0
NatServerChannelHandler.java
...om/virjar/g4proxy_new/server/NatServerChannelHandler.java
+7
-0
UserMappingChannelHandler.java
.../virjar/g4proxy_new/server/UserMappingChannelHandler.java
+26
-8
ClientManager.java
...a/com/virjar/g4proxy_new/server/client/ClientManager.java
+27
-19
NatClientImage.java
.../com/virjar/g4proxy_new/server/client/NatClientImage.java
+2
-0
No files found.
app/src/main/java/com/virjar/g4proxy/HttpProxyService.java
View file @
a0512be4
...
...
@@ -128,24 +128,27 @@ public class HttpProxyService extends Service {
}
});
Log
.
i
(
"weijia"
,
"start G4Proxy front service"
);
Launcher
.
startHttpProxyService
(
3128
);
Log
.
i
(
"weijia"
,
"start private network forward task"
);
String
clientKey
=
Settings
.
System
.
getString
(
getContentResolver
(),
Settings
.
Secure
.
ANDROID_ID
);
ProxyClient
.
start
(
Constants
.
g4ProxyServerHost_1
,
Constants
.
g4ProxyServerPort
,
clientKey
);
ProxyClient
.
start
(
Constants
.
g4ProxyServerHost_2
,
Constants
.
g4ProxyServerPort
,
clientKey
);
Log
.
i
(
"weijia"
,
"start G4Proxy front service"
);
Launcher
.
startHttpProxyService
(
3128
);
// Log.i("weijia", "start private network forward task");
//
// ProxyClient.start(Constants.g4ProxyServerHost_1, Constants.g4ProxyServerPort, clientKey);
//
// ProxyClient.start(Constants.g4ProxyServerHost_2, Constants.g4ProxyServerPort, clientKey);
//新的代理服务器实现
//默认使用3128,为了不影响之前的代码,先设置为3129
LittelProxyBootstrap
.
setLittelServerPort
(
3129
);
G4ProxyClient
g4ProxyClient
=
new
G4ProxyClient
(
Constants
.
g4ProxyServerHost_1
,
Constants
.
g4ProxyServerPort
,
clientKey
);
G4ProxyClient
g4ProxyClient
=
new
G4ProxyClient
(
"www.scumall.com"
,
50000
,
clientKey
);
g4ProxyClient
.
startup
();
G4ProxyClient
g4ProxyClient2
=
new
G4ProxyClient
(
Constants
.
g4ProxyServerHost_2
,
Constants
.
g4ProxyServerPort
,
clientKey
);
g4ProxyClient2
.
startup
();
//
G4ProxyClient g4ProxyClient2 = new G4ProxyClient(Constants.g4ProxyServerHost_2, Constants.g4ProxyServerPort, clientKey);
//
g4ProxyClient2.startup();
}
}
g4proxy-new/src/main/java/com/virjar/g4proxy_new/client/G4ProxyClient.java
View file @
a0512be4
...
...
@@ -57,7 +57,7 @@ public class G4ProxyClient {
}
});
Bootstrap
join2NatServerBootStrap
=
new
Bootstrap
();
join2NatServerBootStrap
=
new
Bootstrap
();
join2NatServerBootStrap
.
group
(
workerGroup
);
join2NatServerBootStrap
.
channel
(
NioSocketChannel
.
class
);
join2NatServerBootStrap
.
handler
(
new
ChannelInitializer
<
SocketChannel
>()
{
...
...
@@ -70,6 +70,8 @@ public class G4ProxyClient {
ch
.
pipeline
().
addLast
(
new
NatClientChannelHandler
(
G4ProxyClient
.
this
));
}
});
forceReconnect
();
}
private
volatile
boolean
isConnecting
=
false
;
...
...
g4proxy-new/src/main/java/com/virjar/g4proxy_new/client/LittleProxyChannelHandler.java
View file @
a0512be4
...
...
@@ -34,16 +34,36 @@ public class LittleProxyChannelHandler extends SimpleChannelInboundHandler<ByteB
channel
.
close
();
return
;
}
NatMessage
natMessage
=
new
NatMessage
();
byte
[]
bytes
=
new
byte
[
msg
.
readableBytes
()];
msg
.
readBytes
(
bytes
);
natMessage
.
setData
(
bytes
);
natMessage
.
setSerialNumber
(
seq
);
natMessage
.
setType
(
NatMessage
.
P_TYPE_TRANSFER
);
natChannel
.
writeAndFlush
(
natMessage
);
log
.
info
(
"receive data from littel proxy"
);
// 这里需要处理分包的问题,文件下载场景,这个包可能非常大。会导致 io.netty.handler.codec.TooLongFrameException: Adjusted frame length exceeds 1048576: 103335954 - discarded
int
maxPackSize
=
Constant
.
MAX_FRAME_LENGTH
-
128
;
while
(
msg
.
readableBytes
()
>
maxPackSize
)
{
byte
[]
bytes
=
new
byte
[
maxPackSize
];
msg
.
readBytes
(
bytes
);
NatMessage
natMessage
=
new
NatMessage
();
natMessage
.
setData
(
bytes
);
natMessage
.
setSerialNumber
(
seq
);
natMessage
.
setType
(
NatMessage
.
P_TYPE_TRANSFER
);
//write,但是不需要 flush
natChannel
.
write
(
natMessage
);
log
.
info
(
"receive data from littel proxy"
);
}
if
(
msg
.
readableBytes
()
>
0
)
{
NatMessage
natMessage
=
new
NatMessage
();
byte
[]
bytes
=
new
byte
[
msg
.
readableBytes
()];
msg
.
readBytes
(
bytes
);
natMessage
.
setData
(
bytes
);
natMessage
.
setSerialNumber
(
seq
);
natMessage
.
setType
(
NatMessage
.
P_TYPE_TRANSFER
);
natChannel
.
writeAndFlush
(
natMessage
);
log
.
info
(
"receive data from littel proxy"
);
}
else
{
natChannel
.
flush
();
}
}
...
...
g4proxy-new/src/main/java/com/virjar/g4proxy_new/protocol/Constant.java
View file @
a0512be4
...
...
@@ -4,6 +4,7 @@ import io.netty.channel.Channel;
import
io.netty.util.AttributeKey
;
public
class
Constant
{
//单个报文,最大1M,超过1M需要分段
public
static
final
int
MAX_FRAME_LENGTH
=
1024
*
1024
;
public
static
final
int
LENGTH_FIELD_OFFSET
=
0
;
...
...
g4proxy-new/src/main/java/com/virjar/g4proxy_new/server/NatServerChannelHandler.java
View file @
a0512be4
...
...
@@ -174,4 +174,11 @@ public class NatServerChannelHandler extends SimpleChannelInboundHandler<NatMess
clientManager
.
closeClient
(
clientId
);
super
.
channelInactive
(
ctx
);
}
@Override
public
void
exceptionCaught
(
ChannelHandlerContext
ctx
,
Throwable
cause
)
throws
Exception
{
//TODO 这里应该怎么办???
super
.
exceptionCaught
(
ctx
,
cause
);
}
}
g4proxy-new/src/main/java/com/virjar/g4proxy_new/server/UserMappingChannelHandler.java
View file @
a0512be4
...
...
@@ -75,15 +75,33 @@ public class UserMappingChannelHandler extends SimpleChannelInboundHandler<ByteB
return
;
}
byte
[]
bytes
=
new
byte
[
msg
.
readableBytes
()];
msg
.
readBytes
(
bytes
);
NatMessage
natMessage
=
new
NatMessage
();
natMessage
.
setType
(
NatMessage
.
P_TYPE_TRANSFER
);
natMessage
.
setSerialNumber
(
seq
);
natMessage
.
setData
(
bytes
);
client
.
getNatChannel
().
writeAndFlush
(
natMessage
);
log
.
info
(
"forward data to client:{}"
,
clientId
);
int
maxPackSize
=
Constant
.
MAX_FRAME_LENGTH
-
128
;
while
(
msg
.
readableBytes
()
>
maxPackSize
)
{
byte
[]
bytes
=
new
byte
[
maxPackSize
];
msg
.
readBytes
(
bytes
);
NatMessage
natMessage
=
new
NatMessage
();
natMessage
.
setData
(
bytes
);
natMessage
.
setSerialNumber
(
seq
);
natMessage
.
setType
(
NatMessage
.
P_TYPE_TRANSFER
);
//write,但是不需要 flush
client
.
getNatChannel
().
write
(
natMessage
);
log
.
info
(
"receive data from littel proxy"
);
}
if
(
msg
.
readableBytes
()
>
0
)
{
NatMessage
natMessage
=
new
NatMessage
();
byte
[]
bytes
=
new
byte
[
msg
.
readableBytes
()];
msg
.
readBytes
(
bytes
);
natMessage
.
setData
(
bytes
);
natMessage
.
setSerialNumber
(
seq
);
natMessage
.
setType
(
NatMessage
.
P_TYPE_TRANSFER
);
client
.
getNatChannel
().
writeAndFlush
(
natMessage
);
log
.
info
(
"receive data from littel proxy"
);
}
else
{
client
.
getNatChannel
().
flush
();
}
}
...
...
g4proxy-new/src/main/java/com/virjar/g4proxy_new/server/client/ClientManager.java
View file @
a0512be4
...
...
@@ -27,28 +27,32 @@ public class ClientManager {
public
boolean
registerNewClient
(
String
client
,
Channel
channel
)
{
NatClientImage
natClientImage
=
natClientImageMap
.
get
(
client
);
Integer
mappingPort
;
if
(
natClientImage
!=
null
)
{
natClientImage
.
updateChannel
(
channel
);
return
true
;
log
.
warn
(
"update nat channel"
);
natClientImage
.
getNatChannel
().
close
();
natClientImage
.
closeAllUserChannel
();
mappingPort
=
natClientImage
.
getMappingPort
();
}
else
{
mappingPort
=
AvailablePortResManager
.
allocate
();
if
(
mappingPort
==
null
)
{
log
.
error
(
"failed to allocate port"
);
return
false
;
}
ChannelFuture
channelFuture
=
userMappingBootstrap
.
bind
(
mappingPort
);
try
{
channelFuture
.
get
();
}
catch
(
Exception
e
)
{
log
.
error
(
"wait for port binding error"
,
e
);
return
false
;
}
if
(!
channelFuture
.
isSuccess
())
{
log
.
warn
(
"bind mapping port:{} failed"
,
mappingPort
,
channelFuture
.
cause
());
return
false
;
}
}
Integer
mappingPort
=
AvailablePortResManager
.
allocate
();
if
(
mappingPort
==
null
)
{
log
.
error
(
"failed to allocate port"
);
return
false
;
}
ChannelFuture
channelFuture
=
userMappingBootstrap
.
bind
(
mappingPort
);
try
{
channelFuture
.
get
();
}
catch
(
Exception
e
)
{
log
.
error
(
"wait for port binding error"
,
e
);
return
false
;
}
if
(!
channelFuture
.
isSuccess
())
{
log
.
warn
(
"bind mapping port:{} failed"
,
mappingPort
,
channelFuture
.
cause
());
return
false
;
}
channel
.
attr
(
Constant
.
NAT_CHANNEL_CLIENT_KEY
).
set
(
client
);
clientPortBiMap
.
put
(
client
,
mappingPort
);
natClientImage
=
new
NatClientImage
(
client
,
mappingPort
,
channel
);
...
...
@@ -62,7 +66,11 @@ public class ClientManager {
}
public
NatClientImage
getClient
(
Integer
mappingPort
)
{
return
natClientImageMap
.
get
(
clientPortBiMap
.
inverse
().
get
(
mappingPort
));
String
clientId
=
clientPortBiMap
.
inverse
().
get
(
mappingPort
);
if
(
clientId
==
null
)
{
return
null
;
}
return
natClientImageMap
.
get
(
clientId
);
}
...
...
g4proxy-new/src/main/java/com/virjar/g4proxy_new/server/client/NatClientImage.java
View file @
a0512be4
...
...
@@ -15,6 +15,7 @@ public class NatClientImage {
@Getter
private
String
clientId
;
private
AtomicLong
seqGenerator
=
new
AtomicLong
(
0
);
@Getter
private
int
mappingPort
;
@Getter
private
Channel
natChannel
;
...
...
@@ -67,5 +68,6 @@ public class NatClientImage {
for
(
Channel
channel
:
userMappingChannels
.
values
())
{
releaseConnection
(
channel
);
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment