package client; import com.google.protobuf.Message; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import protobuf.Utils; import protobuf.generate.cli2srv.chat.Chat; import protobuf.generate.cli2srv.login.Auth; import java.io.IOException; import java.util.concurrent.atomic.AtomicLong; /** * Created by Dell on 2016/2/15. * 模拟客户端聊天:自己给自己发消息 */ public class ClientHandler extends SimpleChannelInboundHandler<Message> { public static ChannelHandlerContext _gateClientConnection; private static final Logger logger = LoggerFactory.getLogger(ClientHandler.class); String _userId = ""; boolean _verify = false; private static int count = 0; public static AtomicLong increased = new AtomicLong(1); @Override public void channelActive(ChannelHandlerContext ctx) throws IOException { _gateClientConnection = ctx; String passwd = "123"; _userId = Long.toString(increased.getAndIncrement()); sendCRegister(ctx, _userId, passwd); sendCLogin(ctx, _userId, passwd); } void sendCRegister(ChannelHandlerContext ctx, String userid, String passwd) { Auth.CRegister.Builder cb = Auth.CRegister.newBuilder(); cb.setUserid(userid); cb.setPasswd(passwd); ByteBuf byteBuf = Utils.pack2Client(cb.build()); ctx.writeAndFlush(byteBuf); logger.info("send CRegister userid:{}", _userId); } void sendCLogin(ChannelHandlerContext ctx, String userid, String passwd) { Auth.CLogin.Builder loginInfo = Auth.CLogin.newBuilder(); loginInfo.setUserid(userid); loginInfo.setPasswd(passwd); loginInfo.setPlatform("ios"); loginInfo.setAppVersion("1.0.0"); ByteBuf byteBuf = Utils.pack2Client(loginInfo.build()); ctx.writeAndFlush(byteBuf); logger.info("send CLogin userid:{}", _userId); } @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, Message msg) throws Exception { logger.info("received message: {}", msg.getClass()); if(msg instanceof Auth.SResponse) { Auth.SResponse sp = (Auth.SResponse) msg; int code = sp.getCode(); String desc = sp.getDesc(); switch (code) { //登录成功 case Common.VERYFY_PASSED: logger.info("Login succeed, description: {}", desc); _verify = true; break; //登录账号不存在 case Common.ACCOUNT_INEXIST: logger.info("Account inexsit, description: {}", desc); break; //登录账号或密码错误 case Common.VERYFY_ERROR: logger.info("Account or passwd Error, description: {}", desc); break; //账号已被注册 case Common.ACCOUNT_DUMPLICATED: logger.info("Dumplicated registry, description: {}", desc); break; //注册成功 case Common.REGISTER_OK: logger.info("User registerd successd, description: {}", desc); break; case Common.Msg_SendSuccess: logger.info("Chat Message Send Successed, description: {}", desc); default: logger.info("Unknow code: {}", code); } } else if(msg instanceof Chat.SPrivateChat) { logger.info("{} receiced chat message: {}.Total:{}", _userId, ((Chat.SPrivateChat) msg).getContent(), ++count); } //这样设置的原因是,防止两方都阻塞在输入上 if(_verify) { sendMessage(); Thread.sleep(Client.frequency); } } void sendMessage() { // logger.info("WelCome To Face2face Chat Room, You Can Say Something Now: "); // Scanner sc = new Scanner(System.in); // String content = sc.nextLine(); String content = "Hello, I am Tom!"; // logger.info("{} Send Message: {} to {}", _userId, content, _friend); Chat.CPrivateChat.Builder cp = Chat.CPrivateChat.newBuilder(); cp.setContent(content); cp.setSelf(_userId); cp.setDest(_userId); ByteBuf byteBuf = Utils.pack2Client(cp.build()); _gateClientConnection.writeAndFlush(byteBuf); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { //ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // Close the connection when an exception is raised. cause.printStackTrace(); ctx.close(); } }