netty框架学习之初始篇---多客户端的实现

前面基础已经搞定,那么解决问题的重点来了,如何使用netty搭建一个可以识别不同客户端的server?

晚上回来经过一个多小时的奋斗,搞定了这个问题,但是我也不知道我这种方式是否有什么问题或者说方向是否正确,感觉与自己用bio写的socket似乎是一样的道理,简单的地方就是无需关注线程问题。


上代码,

package com.netty.demo2;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class HelloServerHandler extends SimpleChannelInboundHandler<String> {
	static Map<String, Channel> channelMap = new HashMap<String, Channel>();//用于存储客户端id与channel的关系
    /**
     * 覆盖了 channelRead0() 事件处理方法。每当从服务端读到客户端写入信息时,将信息转发给其他客户端的 Channel。
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
    	Channel channel = ctx.channel();
    	if(msg.equals("111111")||msg.equals("222222")){
    		channelMap.put(msg,channel);
    	}
        System.out.println(ctx.channel().remoteAddress() + " Say : " + msg);// 收到消息直接打印输出
        byte [] b = {0x01,0x02};
        if(msg.equals("123")){
        	channelMap.get("222222").writeAndFlush("发送给123的信息");
        }else if(msg.equals("456")){
        	channelMap.get("111111").writeAndFlush("发送给456的信息");
		}
    }
    

	/**
     * 
     * 覆盖 channelActive 方法 在channel被启用的时候触发 (在建立连接的时候)
     * 
     * channelActive 和 channelInActive 在后面的内容中讲述,这里先不做详细的描述
     * */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("RamoteAddress : " + ctx.channel().remoteAddress() + " active !");
        ctx.writeAndFlush( "Welcome to " + InetAddress.getLocalHost().getHostName() + " service!\n");
        super.channelActive(ctx);
    }
    
}



这个是HelloServerHandler 的完整版,首先继承SimpleChannelInboundHandler类并覆盖其中的几个方法,代码中写的很详细,各个方法的作用就不再赘述。


详细的讲一下流程和几个细节问题,

流程:client连接到server时,首先发送一个注册id到server,比如A客户端发送“111111”这样的字符串表示其id,B客户端发送“222222”,当A连接到server发送其注册id时将其与channel存储到channelMap中,当B连接到server的时候做同样处理。此时就有两个客户端连接到了server了,那么让A发送“123”字符串,当server收到后将其发送给B。如何发送给B呢,当A发送123的时候,channelRead0方法中的channel时A的channel而不是B的,于是我们首先要拿到B的channel才能调用writer方法给B发消息,那么此时就要调用map的get方法,获取map中的channel,于是这样路就通了。

结果:


客户端使用的一个软件模拟的,这个软件可以多开,省去了写客户端的麻烦,回头上传。

细节:

此处的Map必须静态化,不然是没法存储不同的channel的。

channelMap用来存储客户端id与channel的对应关系,所谓的客户端id就是客户端的注册名称。


下一步与数据库整合,并实现后台管理(不知道是用struts2还是servlet或者spring mvc,,,选择综合症)

有时间再研究下websocket是如何实现的。。。


小弟菜鸟,有不对的地方望大神指正,另外这种区分客户端的方式如果有更简便、更高效,更牛逼的方式希望童鞋们能教导一下


爱编程,爱学习,爱挑战。

程序猿就是我,我就是程序猿。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值