还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来!

netty01   、 netty02  、netty03

看到这里、你基本上可以使用netty接受信息和根据对应的信息返回信息了


接下来我们在web项目中使用,通过访问去启动,通过请求去给指定的客户端发信息,所以说到这篇就是重点了,我们不讲底层,不讲理论,直接上代码!

因为自己就是从零开始的,一上来你就给我讲一大堆理论、底层、我就mmp哦!了解底层我个人觉得你总是得会基本的使用了然后再开始去理解底层吧,不然那么枯燥无味的事情,谁会喜欢?

那我们就接着上一篇的来哈!

package com.netty.nettys01;
import com.service.NettyTest01;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelId;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import static org.apache.http.Consts.UTF_8; public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
/**
* 在这里使用DefaultChannelGroup将每次连接的 Channel 存起来,每一个Channel 底层就是一个连接
*/
private static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
private static final Map map = new HashMap<String,ChannelId>();
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
/**
* 这里就是添加了
*/
channels.add(ctx.channel());
/**
* 获取每一个连接的唯一标示吧,相当于
*/
ChannelId Id= ctx.channel().id();
/**
* map就不用解释了吧,这里就用 1 代替了key;正常项目的话肯定使用用户的唯一标示了
*/
map.put("1",Id);
/**
* 这里只是写了个测试遍历了一下
*/
Iterator<Channel> ls= channels.iterator();
while (ls.hasNext()){
Channel l= ls.next();
System.out.println(l.id().toString());
} } /**
* 下面这两个get方法是个人使用方法,不好的还希望大家给点意见
* @return
*/
public static ChannelGroup getChannels() {
return channels;
}
public static Map getMap() {
return map;
} @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf in=(ByteBuf)msg;
System.out.println(ctx.channel().id().toString()+"收到信息:"+in.toString(UTF_8)); String reMsg="66666";
ByteBuf in2= Unpooled.copiedBuffer(reMsg.getBytes());
ctx.writeAndFlush(in2);
new NettyTest01().test(null,null); } @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}

对于上面的代码,虽然有注释了。不过我还是说一下大概思路吧

channelActive 这个方法会在每次有连接进来的时候执行!
DefaultChannelGroup 这个对象可以用来存储连接,其实我觉得用其他的存也可以哈,不过既然netty本身提供了,我想应该有它自己的优势吧

最后使用一个map存下了登录的唯一标示;虽然key写死了为 1;也就是每次登录会覆盖上一个;这里就只模拟指定发给最后一个登录的客户端了,保存的方式有很多,基于每个项目架构的不同,我也就不多说了!

下面是发信息的类
package com.service;

import com.netty.nettys01.DiscardServerHandler;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelId;
import io.netty.channel.group.ChannelGroup;
import org.springframework.stereotype.Service; import java.util.Iterator;
import java.util.Map; @Service
public class NettyTest01 { public void test(ChannelId id,String key){
/**
* 每次调用获取所有的连接;
*/
ChannelGroup channelGroup=DiscardServerHandler.getChannels();
Map<String,ChannelId> map= DiscardServerHandler.getMap();
if (key!=null){
ChannelId id2= map.get("1");
Channel el= channelGroup.find(id2);
el.writeAndFlush(Unpooled.copiedBuffer("99999".getBytes()));
return;
} Iterator<Channel> ls= channelGroup .iterator();
while (ls.hasNext()){
Channel l= ls.next();
System.out.println(l.id().toString());
l.writeAndFlush(Unpooled.copiedBuffer("1234545".getBytes()));
} } }

接着说这个类的思路吧,这个类写在service层,交由spring管理了;自然就可以注入到你想注入的地方了!

调用方法判断是否传入key,如果不传入就群发,传入了就发给指定的,当然这里的规则就是你们自己定了

就是根据对应的key获取对应的连接,然后发送信息

下面的是controller 层 的访问启动服务代码,随意写个案例,我就随便放代码了(*╹▽╹*)

package com.controller;
import com.netty.nettys01.DiscardServer;
import com.service.NettyTest01;
import com.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class Controller01 {
@Autowired
private TestService testService;
@Autowired
private NettyTest01 nettyTest01; @Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor; @RequestMapping("test2")
public String test02() throws Exception { System.out.println(123); int c= threadPoolTaskExecutor.getActiveCount();
System.out.println("c="+c);
nettyTest01.test(null,"1");
return "index";
} @RequestMapping("test4")
@ResponseBody
public String test04() throws Exception {
new Thread(new Runnable() {
public void run() {
int port;
/* if (args.length > 0) {
port = Integer.parseInt(args[0]);
} else {
port = 8080;
}*/
port = 8089;
try {
new DiscardServer(port).run();
}catch (Exception e){
System.out.println(123);
} }
}).start(); return "1";
} @RequestMapping("test3")
@ResponseBody
public int test03(){
System.out.println(123); /* for(int i=0;i<100;i++){
threadPoolTaskExecutor.execute(new Runnable() {
public void run() {
synchronized (Controller01.class) {
try {
String i= HttpUtils.get("http://192.168.31.223:8085/test4.do");
System.out.println(i);
System.out.println(System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
} }); }*/
return testService.get();
}
}
说一下这个类吧,test4 请求是用来启动的,由于本身启动是堵塞的,所以使用线程启动。。。。。。
test2 是收到请求以后会给key为1的连接发送信息
回到上面的方法 可以看出 是给最后一个连接发送了信息 99999 这个就是指定的发了
如果传入两个 null ,就会群发了。。。这篇先说到这里 ,。。。因为我也还在学习。。。。。 可以在连接的时候将对应的id传于客户端,让客户端将id和用户id发回来保存,这样就可以根据用户id获取连接id了

netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~的更多相关文章

  1. socket 服务器向指定的客户端发消息

    一.需求 需求如题. 当多个客户端连接服务器时,服务器如何给指定的客户端发送消息. 二.解决方案 核心思想: 在服务器端,需保存不同客户端的socket列表及客户端相关信息. socket含有发送方和 ...

  2. (转)openfire插件开发(三)通过http方式向openfire客户端发信息

    转:http://blog.csdn.net/hzaccp3/article/details/19964655 需求:  通过http方式,向openfire客户端发信息(非XMPP协议)openfi ...

  3. 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)

    http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s/1jpHZjW_7 ...

  4. 7-51单片机ESP8266学习-AT指令(8266TCP服务器,编写自己的C#TCP客户端发信息给单片机控制小灯的亮灭)

    http://www.cnblogs.com/yangfengwu/p/8780182.html 自己都是现做现写,如果想知道最终实现的功能,请看最后 先把源码和资料链接放到这里 链接: https: ...

  5. node.js中express模块创建服务器和http模块客户端发请求

    首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...

  6. filter过滤器 默认情况下只对客户端发来的请求有过滤作用 对服务端的跳转不起作用 需要显示的在xml定义过滤的方式才行

    filter过滤器 默认情况下只对客户端发来的请求有过滤作用 对服务端的跳转不起作用 需要显示的在xml定义过滤的方式才行

  7. socket(tcp)互发信息

    一:有图有真相,很简单 a, b, Thread 构造函数(ParameterizedThreadStart)初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. 参数star ...

  8. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  9. 利用python itchat给女朋友定时发信息

    利用itchat给女朋友定时发信息 涉及到的技术有itchat,redis,mysql,最主要的还是mysql咯,当然咯,这么多东西,我就只介绍我代码需要用到的,其他的,如果需要了解的话,就需要看参考 ...

随机推荐

  1. zookeeper的三种安装模式

    zookeeper的安装分为三种模式:单机模式.集群模式和伪集群模式. 1.单机模式 首先,从Apache官网下载一个Zookeeper稳定版本,本次教程采用的是zookeeper-3.4.9版本. ...

  2. 每天备份tomcat日志

    #!/bin/bash Backup_Home=/data/backup-log mkdir -p $Backup_Home Log_Home=/data/Tomcat/logs App_Log_Ho ...

  3. npm i 和 npm install 的区别

    实际使用的区别点主要如下(windows下): 1. 用npm i安装的模块无法用npm uninstall删除,用npm uninstall i才卸载掉 2. npm i会帮助检测与当前node版本 ...

  4. SpringMvc + Jsp+ 富文本 kindeditor 进行 图片ftp上传nginx服务器 实现

    一:html 原生态的附件上传 二:实现逻辑分析: 1.1.1 需求分析 Common.js 1.绑定事件 2.初始化参数 3.上传图片的url: /pic/upload 4.上图片参数名称: upl ...

  5. Confluence 6 查看索引和提示

    查看索引 Confluence 使用被称为 Lucene 的搜索引擎.如果你希望在你的 Confluence站点中查看更多有关索引的细节,你可以下载并且运行 Luke.Luke 是一个开发和诊断工具, ...

  6. Cookie禁用了,Session还能用吗?原因详解

    Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案.但为什么禁用Cookie就不能得到Session ...

  7. Eclipse搭建C++\C开发环境

    1.最近使用visualStudio IDE开发Unity 3D使用的编程语言是C#但是发现visualStudio12 版本在自己主机上运行速度比够快,怀疑是不是处理器或者是版本问题,所以该卸载了, ...

  8. python文件操作r+,w+,a+,rb+,

    w:以写方式打开, a:以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+:以读写模式打开 w+:以读写模式打开 (参见 w ) a+:以读写模式打开 (参见 a ) rb:以二进制读模式 ...

  9. HDU 1452 Happy 2004(因数和+费马小定理+积性函数)

    Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  10. 51 Nod 1240 莫比乌斯函数

    1240 莫比乌斯函数  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使 ...