说明:基于netty 3.9.2的udp协议实现的(如果你使用的版本是4.X或5.X,请参考其他方法);程序的逻辑结构是,客户端发送给服务端一串数据,服务器端返回给客户端“A”。在进行游戏开发时需要对udp的丢包进行处理,可以利用服务器端的返回值进行相关处理,以确定是否重发,这方面具体没有实现。

文章结构:

一、服务器端

1、UDPServer

2、UdpChannelPipelineFactory

3、UDPServerHandler

二、客户端

1、UDPClient

2、UDPClientChannelPipelineFactory

3、UDPClientHandler

三、ScanGetPort获取一个可用的端口号

一、服务器端

1、UDPServer

初始化一个ConnectionlessBootstrap,setPipelineFactory,绑定一个端口号。ScanGetPort是一个工具类就是,获取一个可用的端口号,源代码在最后面贴出。

package com.ls.udp.server;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory; import com.andy.server.util.ScanGetPort; public class UDPServer { public final int PORT;
public UDPServer(int port){
PORT=port;
}
private ConnectionlessBootstrap bootstrap;
void start(){
//init the bootstrap
bootstrap=new ConnectionlessBootstrap(new NioDatagramChannelFactory(Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new UdpChannelPipelineFactory());
bootstrap.bind(new InetSocketAddress(PORT));
System.out.println("server start at:"+":"+PORT);
} public static void main(String[] args) {
/*
* 获取一个可用的端口号
*/
int port= new ScanGetPort().getPot(8080);
new UDPServer(port).start();
} }

2、UdpChannelPipelineFactory

注册一个handler

package com.ls.udp.server;

import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels; public class UdpChannelPipelineFactory implements ChannelPipelineFactory{ /**
* set the channel pipeline
*
*/
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("handler", new UDPServerHandler());
return pipeline;
}
}

3、UDPServerHandler

handler类

package com.ls.udp.server;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.DynamicChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler; public class UDPServerHandler extends SimpleChannelUpstreamHandler{ /**
* 对于ChannelHandler,
* 是UDP与TCP区别的核心所在。
* 大家都知道UDP是无连接的,
* 也就是说你通过 MessageEvent 参数对象的 getChannel() 方法获取当前会话连接,
* 但是其 isConnected() 永远都返回 false。
* UDP 开发中在消息获取事件回调方法中,
* 获取了当前会话连接 channel 对象后可直接通过 channel 的 write 方法发送数据给对端 channel.write(message, remoteAddress),
* 第一个参数仍然是要发送的消息对象,
* 第二个参数则是要发送的对端 SocketAddress 地址对象。
* 这里最需要注意的一点是SocketAddress,在TCP通信中我们可以通过channel.getRemoteAddress()获得,
* 但在UDP通信中,我们必须从MessageEvent中通过调用getRemoteAddress()方法获得对端的SocketAddress 地址。
*/
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception { ChannelBuffer buffer = (ChannelBuffer)e.getMessage();
byte[] recByte=buffer.copy().toByteBuffer().array(); String msg=new String(recByte);
System.out.println("from client:"+msg); ChannelBuffer responseBuffer= new DynamicChannelBuffer(1); responseBuffer.writeBytes("A".getBytes()); //write to the client
e.getChannel().write(responseBuffer, e.getRemoteAddress()); super.messageReceived(ctx, e);
} @Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
throws Exception {
super.exceptionCaught(ctx, e);
} }

二、客户端

(基本结构和服务器端很像,不再赘述)

1、UDPClient

package com.ls.udp.client;

import java.net.InetSocketAddress;
import java.util.Scanner; import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.DynamicChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory; public class UDPClient { private ConnectionlessBootstrap bootstrap;
private Channel channel;
public void start(){
//init the bootstrap
bootstrap=new ConnectionlessBootstrap(new NioDatagramChannelFactory());
bootstrap.setPipelineFactory(new UDPClientChannelPipelineFactory());
bootstrap.setOption("localAddress", new InetSocketAddress(10001));
channel=bootstrap.bind();
} public void writebytes(byte[] bt,InetSocketAddress isa){
if(bootstrap==null){
this.start();
}
ChannelBuffer responseBuffer= new DynamicChannelBuffer(12); responseBuffer.writeBytes(bt);
channel.write(responseBuffer, isa);
} public static void main(String[] args) { UDPClient uClient=new UDPClient(); Scanner scanner=new Scanner(System.in);
String lienString=scanner.nextLine();
while(!lienString.equals("bye")){ uClient.writebytes(lienString.getBytes(), new InetSocketAddress("192.168.1.107",8080));
lienString=scanner.nextLine();
}
} }

2、UDPClientChannelPipelineFactory

package com.ls.udp.client;

import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
public class UDPClientChannelPipelineFactory implements ChannelPipelineFactory{ /**
* set the channel pipeline
*
*/
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("handler", new UDPClientHandler());
return pipeline;
}
}

3、UDPClientHandler

package com.ls.udp.client;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler; public class UDPClientHandler extends SimpleChannelUpstreamHandler{ @Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception { ChannelBuffer buffer = (ChannelBuffer)e.getMessage();
byte[] recByte=buffer.copy().toByteBuffer().array(); String msg=new String(recByte);
System.out.println("from server:"+msg); super.messageReceived(ctx, e);
} @Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
throws Exception {
super.exceptionCaught(ctx, e);
} }

三、ScanGetPort获取一个可用的端口号

package com.andy.server.util;

import java.io.IOException;
import java.net.ServerSocket;
/**
* get the port
* @author red
*
*/
public class ScanGetPort {
public synchronized int getPot(int first){
for(int i=first;i<65535;++i){
ServerSocket ss=null;
try {
ss= new ServerSocket(i);
} catch (IOException e) {
//e.printStackTrace();
}finally{
if(ss!=null){
if(ss.isBound()){
try {
ss.close();
System.out.println(i);
return i;
} catch (IOException e) {
e.printStackTrace();
} }
}
}
}
return -1;
}
}

netty 3.9.2 UDP协议服务器和客户端DEMO的更多相关文章

  1. Java实例练习——基于UDP协议的多客户端通信

    昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...

  2. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  3. netty系列之:使用UDP协议

    目录 简介 UDP协议 String和ByteBuf的转换 构建DatagramPacket 启动客户端和服务器 总结 简介 在之前的系列文章中,我们到了使用netty做聊天服务器,聊天服务器使用的S ...

  4. 闲来无事,写个基于UDP协议的Socket通讯Demo

    项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...

  5. Netty入门(二)时间服务器及客户端

    在这个例子中,我在服务器和客户端连接被创立时发送一个消息,然后在客户端解析收到的消息并输出.并且,在这个项目中我使用 POJO 代替 ByteBuf 来作为传输对象. 一.服务器实现 1.  首先我们 ...

  6. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

  7. netty入坑第一步:了解netty和编写简单的Echo服务器和客户端

    早期java API通过原生socket产生所谓的"blocking",大致过程是这样 这种的特点是每次只能处理一个请求,如果要实现多个请求并行,就还要分配一个新的线程来给每个客户 ...

  8. 网络编程-UDP的服务器和客户端----keep on going never give up

    1 //**************************************服务器********************************************** 2 #inclu ...

  9. 没错,请求DNS服务器还可以使用UDP协议

    目录 简介 搭建netty客户端 在netty中发送DNS查询请求 DNS消息的处理 总结 简介 之前我们讲到了如何在netty中构建client向DNS服务器进行域名解析请求.使用的是最常见的TCP ...

随机推荐

  1. jQuery 代码的层定位滑动动画效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 系统如何端子app弄root才干

    最近由于调试USB OTG怪东西.这导致USB端口被占用,这项.虽然我是project版本号,但不能运行adb shell,这是不可能的debug该. 所以,我现在是一个系统终端apk,规划 http ...

  3. IBatis.net初步使用

    最近加班比较忙,时间也比较琐碎,蛮久没有写东西了.这次就总结一下自己使用IBatis.net的一些总结吧. IBatis简介 IBatis.net是一款开源的Orm框架,应该算是从java的IBati ...

  4. [Android] App在三星某些机子上闪退:"不保留活动"

    今天遇到用户反映应用总是闪退. 现象:在MainActivity后,只要进入任何主进程相关的二级界面,都会导致应用闪退(注:不是崩溃引起的,只是闪退) 分析:1.看log日志,退出前有抛出异常,但查看 ...

  5. netback于kthread遇到cpu affinity问题

    最近的升级netback, 在测试过程中,查找vm全双工压力,rx的pps波动很厉害,见rx kthread尽管cpu affinity它是0-7 (dom0 8vcpu), 但往往,她去了物理破坏c ...

  6. 3-08. 栈模拟队列(25)(ZJU_PAT 模拟)

    主题链接:http://pat.zju.edu.cn/contests/ds/3-08 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操 ...

  7. 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境

    搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...

  8. Linux内核分析(五)----字符设备驱动实现

    原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷, ...

  9. 【iOS】多线程GCD

    GCD(Grand Central Dispatch) : 牛逼的中枢调度器.苹果自带,纯C语言实现,提供了许多且强大的函数,它能够提高代码的运行效率与多核的利用率. 一.GCD的基本使用 1.GCD ...

  10. 使用requirejs实现模块化编程

    > 序言 - -# 公司大了,业务多了,前端代码量也逐渐增大,我们渐渐的依赖js实现的交互越来越多,长期以来会导致我们的代码维护越来越困难,所以依赖的插件也越来越多..比如这样页面中有大量的js ...