`

使用 Netty 进行 UDP 网络编程

 
阅读更多
使用 Netty 进行 UDP 网络编程

    在正式开始之前,首先介绍一下TCP和UDP协议。对于做过网络开发的朋友来说,这两个协议应该都不陌生,在此仅摘录网上对两个协议的介绍给大家,仅供参考。
TCP与UDP区别
    TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
    UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
    可以看出,UDP与TCP的主要区别在于:UDP是无连接的,而这一点便是在使用netty进行开发时最重要的区别点了。

    首先,在ChannelFactory 的选择上,UDP的通信选择 NioDatagramChannelFactory,TCP的通信我们选择的是NioServerSocketChannelFactory;在Bootstrap的选择上,UDP选择的是ConnectionlessBootstrap,而TCP选择的是ServerBootstrap。下面是一个UDP通信服务器端的启动程序类:


import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.Executors;

import org.apache.log4j.xml.DOMConfigurator;
import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
import org.jboss.netty.channel.socket.DatagramChannelFactory;
import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.game.netty.network.ServerPipelineFactory;

/** 
* 	作者:chenpeng  
*	E-mail:46731706@qq.com  
* 	创建时间:2012-7-16 上午10:52:30  
* 	netty udp 通信测试 
*/ 
public class ServerTest {

	public static void main(String[] args) {
		int port = 8888;
		DOMConfigurator.configureAndWatch("config/log4j.xml");
		ApplicationContext factory = new FileSystemXmlApplicationContext(
				new String[] { "config/propholder.xml" });
		DatagramChannelFactory udpChannelFactory = new NioDatagramChannelFactory(
				Executors.newCachedThreadPool());
		ConnectionlessBootstrap bootstrap = new ConnectionlessBootstrap(udpChannelFactory);
		
		ServerPipelineFactory udpServerFactory =(ServerPipelineFactory)factory.getBean("serverPipelineFactory");
		bootstrap.setPipelineFactory(udpServerFactory);
		SocketAddress serverAddress = new InetSocketAddress(port);
		bootstrap.bind(serverAddress);
		System.out.println(port+" Server is starting……");
		
	}

}



   对于编解码器decoder和Encoder,以及ChannelPipelineFactory,UDP开发与TCP并没有什么区别,在此不做详细介绍。

    对于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 地址

    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("服务器收到消息:" + msg);

        Random random = new Random();
        int rspWord = random.nextInt(10000);
        System.out.println("服务器写出消息:" + rspWord);

        ChannelBuffer response = new DynamicChannelBuffer(12);
        response.readBytes(rspWord);
        e.getChannel().write(response, e.getRemoteAddress());
    }



选择netty的UDP进行网络游戏开发时,不能忽视的一个问题就是由于UDP的不稳定性造成的丢包是否需要回传。也就是说在发生丢包情况时我们需要建立一个检测机制来确认是否需要重新发送丢包数据,机制相对简单,这里不再赘述。
分享到:
评论
5 楼 cpjsjxy 2016-04-14  
Leipaopao 写道
想问一下楼主有没有使用过netty5来实现udp的单播呢?我自己编了一个程序但是不知道哪里出了问题,客户端和服务端都连接不上。

一直使用netty4,还未来得急升级。之前写过udp的测试例子,可以参考一下。
4 楼 Leipaopao 2016-04-08  
想问一下楼主有没有使用过netty5来实现udp的单播呢?我自己编了一个程序但是不知道哪里出了问题,客户端和服务端都连接不上。
3 楼 cpjsjxy 2016-03-30  
Leipaopao 写道
楼主你好,我想请教的是我所遇到的需要覆盖的函数参数是以下这样的:public void messageReceived(ChannelHandlerContext ctx,DatagramPacket packet) throws Exception{}
怎么您的参数是 MessageEvent e呢?还望请教!

netty的版本不同,写这篇博客的时候netty还是3.X的版本。
2 楼 Leipaopao 2016-03-28  
楼主你好,我想请教的是我所遇到的需要覆盖的函数参数是以下这样的:public void messageReceived(ChannelHandlerContext ctx,DatagramPacket packet) throws Exception{}
怎么您的参数是 MessageEvent e呢?还望请教!
1 楼 di1984HIT 2013-09-13  
写的不错。

相关推荐

    基于java netty的udp客户端声呐数据对接

    Netty本身的API设计清晰,易于理解和使用,使得Java开发者能够快速上手网络编程。 总的来说,这个项目涵盖了网络协议(UDP和TCP)、数据解析(JSON)、协议对接、以及Java和Netty框架的使用。通过深入理解这些知识...

    Netty UDP协议网络打洞实例

    在UDP网络打洞实例中,Netty的优势在于其强大的网络编程能力和灵活性,能够帮助开发者高效地处理UDP数据报文。 首先,理解UDP网络打洞的基本原理。网络打洞通常涉及到STUN(Session Traversal Utilities for NAT)...

    java实现基于netty 的udp字节数据接收服务

    然而,当使用Netty时,我们可以通过`io.netty.channel.udps.UdpServer`和`io.netty.channel.udps.UdpChannel`来构建更复杂的网络应用。下面是一个简单的Netty UDP服务端实现的概述: 1. **创建Bootstrap**: 首先,...

    netty搭建TCP、UDP服务

    总的来说,Netty通过其强大的功能和简单易用的API,极大地降低了网络编程的复杂性,是构建高性能网络应用,尤其是TCP和UDP服务的首选框架。无论是在物联网、游戏服务器、大数据传输还是其他分布式系统中,Netty都能...

    java用netty写udp与tcp.pdf

    在 Netty 中,UDP 编程可以通过使用 `DatagramChannel` 实现,提供了异步的、事件驱动的网络编程模型。Netty 提供了一个简洁的 API,开发者可以快速的创建高性能的 UDP 服务器和客户端程序。 在上面的代码中,我们...

    netty之UDP协议开发

    总的来说,这个“netty之UDP协议开发”项目涵盖了Netty的基本使用,以及如何利用UDP协议进行通信。理解这些内容,对于开发者来说,能够增强在网络编程领域的技能,特别是对于需要处理高并发、低延迟的场景。

    基于Netty网络编程项目实战笔记.7z

    《基于Netty网络编程项目实战笔记》是一份深入探讨Netty框架在实际网络编程中的应用文档。Netty,作为一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种网络应用开发,包括服务器和客户端的实现。这份...

    网络编程之Netty一站式精讲.rar

    它提供了对TCP、UDP、HTTP、HTTPS、WebSocket等常见网络协议的支持,简化了网络编程的复杂性。Netty以其高效的性能、丰富的功能和易用的API,在高并发、低延迟的场景下得到了广泛应用,如游戏服务器、金融交易系统、...

    基于java的netty实现的可靠udp网络库(kcp算法),包含fec实现,可用于游戏,视频,加速等业务

    总的来说,Java KCP结合了Netty的高效网络编程能力、KCP的低延迟可靠传输协议和FEC的数据纠错技术,为Java开发者提供了一种适用于高实时性需求的网络库,尤其适用于游戏、音视频传输和数据加速等业务。

    boot-example-netty-udp-2.0.5

    在现代的网络编程中,Netty作为一个高性能、异步事件驱动的网络应用框架,被广泛应用于构建高并发、低延迟的服务器。而SpringBoot作为Spring框架的轻量级启动器,能够简化微服务的开发流程。本篇将详细讲解如何利用...

    netty教程并发编程

    ### Netty教程并发编程知识点详解 #### 一、Netty简介与并发模型基础 ##### 1.1 Netty概述 Netty是一个高性能、异步事件驱动的网络应用程序框架...希望本篇教程能够帮助大家在实际项目中顺利运用Netty进行并发编程。

    netty网络框架,封装 http,tcp,udp的例子

    Netty 是一个高性能、...通过封装 HTTP、TCP 和 UDP,Netty 提供了一种统一的方式来处理多种网络通信方式,简化了网络编程的复杂性。学习并掌握 Netty,可以提升你在网络编程领域的专业技能,为你的职业生涯增添价值。

    基于Netty框架的网络通信示例.zip

    项目展示了如何使用Netty进行高性能的异步网络编程,并提供了丰富的示例代码和测试用例。 适用人群 有一定Java基础的开发者 对网络编程感兴趣的开发者 希望学习和掌握Netty框架的开发者 使用场景及目标 使用...

    springboot集成netty,使用protobuf作为数据交换格式,可以用于智能终端云端服务脚手架

    在本项目中,Netty 负责处理底层的网络通信,提供高效的TCP/UDP服务,支持长连接,确保实时的数据交互。 Protocol Buffers(protobuf)是Google开发的一种数据序列化协议,它能将结构化的数据序列化为二进制流,...

    Java网络编程 NIO Netty

    Java网络编程领域中,NIO(Non-blocking Input/Output,非阻塞I/O)和Netty框架是两个关键概念。NIO是一种I/O模型,它与传统的BIO(Blocking I/O)模型不同,BIO在处理连接时一旦进行读写操作就会阻塞,直到数据传输...

    (源码)基于Netty框架的网络通信系统.zip

    项目中包含了多种网络编程的示例,如时间服务器、回声服务器、文件服务器等,展示了如何使用Netty进行网络编程。 ## 项目的主要特性和功能 1. 多协议支持支持TCP、UDP、HTTP、WebSocket等多种网络协议,满足不同...

    Netty框架网络编程实战-Netty_chat.zip

    Netty框架是Java领域中的一款高性能、异步事件驱动的网络应用框架,它极大地简化了网络编程,尤其在处理TCP、UDP以及HTTP等协议时。本实战项目"Netty_chat"是一个基于Netty实现的简单聊天应用,旨在帮助开发者深入...

    Netty案例集锦(并发编程篇).pdf

    8. **实战案例**:《Netty案例集锦(并发编程篇)》可能包含如TCP服务器、UDP广播、WebSocket服务器、HTTP服务器、FTP服务器等实际应用场景,通过这些案例,读者可以深入理解Netty在并发场景下的应用和优化技巧。...

    基于Netty网络编程项目实战笔记.rar

    这个项目实战笔记主要涵盖了Netty的核心概念、设计模式以及如何在实际项目中运用Netty进行网络编程。 首先,Netty的核心概念包括通道(Channel)和处理器(Handler)。通道是Netty中的基本I/O抽象,它代表一个连接...

    netty框架各种通信C/S端

    Netty框架是Java领域中广泛使用的高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。它简化了网络编程,提供了丰富的API和强大的功能,适用于TCP、UDP以及多种自定义协议。在...

Global site tag (gtag.js) - Google Analytics