Skip to content

Commit

Permalink
message len change to short
Browse files Browse the repository at this point in the history
  • Loading branch information
omoomoo committed Sep 25, 2016
1 parent 38478cf commit 118337d
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 26 deletions.
1 change: 0 additions & 1 deletion src/main/java/com/cpcb/gs/GameServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

@SuppressWarnings("unused")
public class GameServer {
private final Logger logger = LoggerFactory.getLogger(GameServer.class);

Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/cpcb/gs/adapter/DispatchLogicAdapter.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.cpcb.gs.adapter;

import java.lang.reflect.InvocationTargetException;
import java.nio.charset.StandardCharsets;

import com.cpcb.gs.RpcMessage;
import com.cpcb.gs.RpcMessage.RpcResponse;
Expand Down Expand Up @@ -42,8 +43,8 @@ private void dispatchLogic(ChannelHandlerContext ctx, RpcMessage.RpcRequest requ

private RpcWriter dynamicInvokeRpcMethod(RpcHandlerMapping rpcHandler, byte[] content)
throws IllegalAccessException, InvocationTargetException {
RpcReader rpcReader = new RpcReader(content);
RpcWriter rpcWriter = new RpcWriter();
RpcReader rpcReader = new RpcReader(content, StandardCharsets.UTF_8);
RpcWriter rpcWriter = new RpcWriter(StandardCharsets.UTF_8);

Object[] args = handleParameters(rpcHandler, rpcReader, rpcWriter);
Object returnObj = rpcHandler.method.invoke(ServerContext.ctx.getBean(rpcHandler.clazz), args);
Expand Down Expand Up @@ -96,7 +97,7 @@ private void writeBack(ChannelHandlerContext ctx, RpcMessage.RpcRequest request,
byte[] backBytes = response.toByteArray();

ByteBuf backBuf = ctx.alloc().buffer(backBytes.length);
backBuf.writeInt(backBytes.length);
backBuf.writeShort(backBytes.length);
backBuf.writeBytes(backBytes);
ctx.writeAndFlush(backBuf);
}
Expand Down
21 changes: 15 additions & 6 deletions src/main/java/com/cpcb/gs/adapter/RpcMessageAdapter.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.cpcb.gs.adapter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cpcb.gs.RpcMessage;
import com.google.protobuf.InvalidProtocolBufferException;

Expand All @@ -8,18 +11,24 @@
import io.netty.channel.ChannelInboundHandlerAdapter;

public class RpcMessageAdapter extends ChannelInboundHandlerAdapter {
private final Logger logger = LoggerFactory.getLogger(RpcMessageAdapter.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws InvalidProtocolBufferException {
ByteBuf buf = (ByteBuf) msg;
buf.readInt();

byte[] data = new byte[buf.readableBytes()];
buf.readBytes(data);

RpcMessage.RpcRequest request = RpcMessage.RpcRequest.parseFrom(data);
ctx.fireChannelRead(request);
short mLen = buf.readShort();
if (mLen == 0) {
logger.error("RpcMessage lenth is 0");
} else {
byte[] data = new byte[mLen];
buf.readBytes(data);

RpcMessage.RpcRequest request = RpcMessage.RpcRequest.parseFrom(data);
ctx.fireChannelRead(request);
}
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/cpcb/gs/handler/GameServerHanlder.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public class GameServerHanlder implements ChannelHandler {

public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
ctx.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4));
ctx.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 2));
ctx.pipeline().addLast(new RpcMessageAdapter());
ctx.pipeline().addLast(new DispatchLogicAdapter());
}
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/com/cpcb/gs/io/RpcReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -12,8 +14,10 @@
public class RpcReader {
private final Logger logger = LoggerFactory.getLogger(RpcReader.class);
private DataInputStream input;
private Charset charset;

public RpcReader(byte[] bytes) {
public RpcReader(byte[] bytes, Charset charset) {
this.charset = charset;
input = new DataInputStream(new ByteArrayInputStream(bytes));
}

Expand Down Expand Up @@ -58,7 +62,7 @@ public String readString() {
byte[] bytes = new byte[len];
try {
input.read(bytes);
return new String(bytes);
return new String(bytes, charset);
} catch (IOException e) {
logger.error("RpcReader reach the end of bytes.");
}
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/com/cpcb/gs/io/RpcWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -13,8 +14,10 @@ public class RpcWriter {
private Logger logger = LoggerFactory.getLogger(RpcWriter.class);
private ByteArrayOutputStream byteArray;
private DataOutputStream out;
private Charset charset;

public RpcWriter() {
public RpcWriter(Charset charset) {
this.charset = charset;
byteArray = new ByteArrayOutputStream();
out = new DataOutputStream(byteArray);
}
Expand Down Expand Up @@ -69,7 +72,7 @@ public void WriteBool(boolean value) {

public void WriteString(String str) {
try {
byte[] bytes = str.getBytes();
byte[] bytes = str.getBytes(charset);
out.writeInt(bytes.length);
out.write(bytes);
} catch (IOException e) {
Expand All @@ -79,7 +82,7 @@ public void WriteString(String str) {

public void WriteObject(Object object) {
try {
byte[] bytes = JSON.toJSONString(object).getBytes();
byte[] bytes = JSON.toJSONString(object).getBytes(charset);
out.writeInt(bytes.length);
out.write(bytes);
} catch (IOException e) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/cpcb/gs/logic/LogicPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public ProtocolDeploy getGun(int rpcId, String msg) {

@Rpc("rpc_get_unity")
public ProtocolDeploy getUnity(int rpcId) {
System.out.println("rpcId = " + rpcId);
logger.info("getGun rpc_get_unity");
return ProtocolDeploy.getDeploy(rpcId, ProtocolDeploy.class);
}
Expand Down
23 changes: 13 additions & 10 deletions src/test/java/com/cpcb/gs/ClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.util.Random;

import org.junit.Test;
Expand Down Expand Up @@ -35,7 +36,7 @@ public void run() {
RpcMessage.RpcResponse response = RpcMessage.RpcResponse.parseFrom(bytes);
byte[] content = response.getContent().toByteArray();

RpcReader reader = new RpcReader(content);
RpcReader reader = new RpcReader(content, StandardCharsets.UTF_8);
System.out.println(reader.readString());

}
Expand All @@ -49,37 +50,39 @@ public void run() {
while (true) {
int rpcId = new Random().nextInt(4) + 1;

RpcWriter writer = new RpcWriter();
writer.WriteInt(rpcId);
writer.WriteString("Hello GameServer : " + count++);
RpcWriter writer = new RpcWriter(StandardCharsets.UTF_8);
writer.WriteInt(5);
writer.WriteString("I am Unity Client!");

RequestHeader header = RequestHeader.newBuilder().setRpcId(rpcId).setReqId(rpcId).build();
RequestHeader header = RequestHeader.newBuilder().setRpcId(5).setReqId(1).build();
RpcMessage.RpcRequest request = RpcMessage.RpcRequest.newBuilder().setHeader(header)
.setContent(ByteString.copyFrom(writer.getBytes())).build();

byte[] bytes = request.toByteArray();
out.writeInt(bytes.length);
out.writeShort(bytes.length);
out.write(bytes);
out.flush();
Thread.sleep(500);
}
}

@Test
public void Test_02() throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8080);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());

long start = System.currentTimeMillis();
for (int i = 0; i < 3; i++) {
RpcWriter writer = new RpcWriter();
writer.WriteString("Hello GameServer : " + i);
RpcWriter writer = new RpcWriter(StandardCharsets.UTF_8);
writer.WriteString("I am Unity Client!");

RequestHeader header = RequestHeader.newBuilder().setRpcId(1).setReqId(new Random().nextInt()).build();
RequestHeader header = RequestHeader.newBuilder().setRpcId(5).setReqId(1).build();
RpcMessage.RpcRequest request = RpcMessage.RpcRequest.newBuilder().setHeader(header)
.setContent(ByteString.copyFrom(writer.getBytes())).build();

byte[] bytes = request.toByteArray();
out.writeInt(bytes.length);
System.out.println("len => " + bytes.length);
out.writeShort(bytes.length);
out.write(bytes);
out.flush();
}
Expand Down

0 comments on commit 118337d

Please sign in to comment.