`
longgangbai
  • 浏览: 7349527 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Naga编程的实例应用

阅读更多

       Naga是一个非常小的NIO类库。提供封装Socket和ServerSocket的几个Java类。

简单的类介绍如下:

 

NIOService :创建NIO流的服务对象

NIOServerSocket :相当于IO中ServerSocket

NIOSocket 相当于IO中Socket

ServerSocketObserverAdapter:服务器端ServerSocket的监听适配器

SocketObserverAdapter:客户端SOcket器端的监听适配器

 

 

服务端代码如下:

package com.easyway.space.sockets.naga;

import naga.*;
import naga.packetreader.RegularPacketReader;
import naga.packetwriter.RegularPacketWriter;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * 远程请求服务验证的服务端
 * @author longgangbai
 *
 */
public class NagaServer
{
	NagaServer() {
	}

	public static void main(String... args)
	{
		int port =8090;
		// Create a map with users and passwords.
		//创建一个Map用于存储关于用户的信息的
		final Map<String, String> passwords = new HashMap<String, String>();
		passwords.put("Admin", "password");
		passwords.put("Aaron", "AAAAAAAA");
		passwords.put("Bob", "QWERTY");
		passwords.put("Lisa", "secret");
		try
		{
			//创建一个NIOService服务对象
			NIOService service = new NIOService();
			//创建一个NIOServerSocket服务端对象
			NIOServerSocket socket = service.openServerSocket(port);
			//服务端添加相关的监听器
			socket.listen(new ServerSocketObserverAdapter()
			{
				//当连接成功时执行的代码
				public void newConnection(NIOSocket nioSocket)
				{
					System.out.println("Received connection: " + nioSocket);

					// Set a 1 byte header regular reader.
					nioSocket.setPacketReader(new RegularPacketReader(1, true));

					// Set a 1 byte header regular writer.
					nioSocket.setPacketWriter(new RegularPacketWriter(1, true));

					// Listen on the connection.
					//监听到Socket信息是处理方式
					//备注此处采用的是Socket的观察者适配器
					nioSocket.listen(new SocketObserverAdapter()
					{
						/**
						 * 写数据的到客户端
						 * @param socket
						 * @param packet
						 */
						@SuppressWarnings("unused")
						public void notifyReadPacket(NIOSocket socket, byte[] packet)   
						{     
							socket.write(packet);   
						} 
						/**
						 * 连接发生异常时的处理
						 */
						public void connectionBroken(NIOSocket nioSocket, Exception exception)
						{
						}

                        /**
                         * 连接打开时执行的操作
                         */
						public void connectionOpened(NIOSocket nioSocket)
						{
						}
						/**
						 * 接受数据包的信息
						 */
						public void packetReceived(NIOSocket socket, byte[] packet)
						{
							// We received a packet. Should contain two encoded
							// UTF strings with user and password.
							System.out.println("Login attempt from " + socket);
							try
							{
								// Let us unpack the bytes by converting the bytes to a stream.
								//获取输入的信息
								DataInputStream stream = new DataInputStream(new ByteArrayInputStream(packet));

								// Read the two strings.
								//获取相关的信息
								String user = stream.readUTF();
								String password = stream.readUTF();

								// Prepare to encode the response.
								ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
								DataOutputStream out = new DataOutputStream(byteArrayOutputStream);

								if (!passwords.containsKey(user))
								{
									System.out.println("Unknown user: " + user);
									out.writeUTF("NO_SUCH_USER");
								}
								else if (!passwords.get(user).equals(password))
								{
									out.writeUTF("INCORRECT_PASS");
									System.out.println("Failed login for: " + user);
								}
								else
								{
									out.writeUTF("LOGIN_OK");
									System.out.println("Successful login for: " + user);
								}

								// Create the outgoing packet.
								out.flush();
								//写数据到客户端
								socket.write(byteArrayOutputStream.toByteArray());

								// Close after the packet has finished writing.
								//关闭当前写入流
								socket.closeAfterWrite();
							}
							catch (IOException e)
							{
								// No error handling to speak of.
								//关闭当前的连接
								socket.close();
							}
						}
					});
				}
			});
			
			// Allow all logins.
			//允许所有的不同的ip连接服务器
			socket.setConnectionAcceptor(ConnectionAcceptor.ALLOW);

			// Keep reading IO forever.
			//保持服务为阻塞状态的信息
			while (true)
			{
				service.selectBlocking();
			}
		}
		catch (IOException e)
		{
		}
	}


}

 

 

 

客户端代码如下:

package com.easyway.space.sockets.naga;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;

import naga.NIOService;
import naga.NIOSocket;
import naga.SocketObserver;
import naga.SocketObserverAdapter;
import naga.packetreader.RegularPacketReader;
import naga.packetwriter.RegularPacketWriter;

/**
 * Naga的远程客户端验证 的客户端的代码
 * @author longgangbai
 *
 */
public class NagaClient
{
	NagaClient()
	{}

	/**
	 * Make a login request to the server.
	 *
	 * @param args assumed to be 4 strings representing host, port, account and password.
	 */
	public static void main(String... args)
	{
		try
		{
			// Parse arguments.
			String hostName = "localhost";
			int port = 8090;
			//设置登录的账号信息
			String account ="Admin";
			String password = "password";

			// Prepare the login packet, packing two UTF strings together
			// using a data output stream.
			//将信息写入流中发送到服务端
			ByteArrayOutputStream stream = new ByteArrayOutputStream();
			DataOutputStream dataStream = new DataOutputStream(stream);
			dataStream.writeUTF(account);
			dataStream.writeUTF(password);
			dataStream.flush();
			final byte[] content = stream.toByteArray();
			dataStream.close();

			// Start up the service.
			//设置NIOService的服务对象
			NIOService service = new NIOService();

			//获取相关的ip的信息
			InetAddress intaddress=InetAddress.getByName(hostName);
			// Open our socket.
			//打开当前请求的Socket的对象
			NIOSocket socket = service.openSocket(intaddress.getHostAddress(), port);

			// Use regular 1 byte header reader/writer
			//设置读写信息包的信息
			socket.setPacketReader(new RegularPacketReader(1, true));
			socket.setPacketWriter(new RegularPacketWriter(1, true));

			// Start listening to the socket.
			//添加相关的监听事件用于监听客户端
			socket.listen(new SocketObserver()
			{
				/** A null object used as the default observer */
				SocketObserver NULL = new SocketObserverAdapter();
				/**
				 * 连接成功时的相关的操作
				 */
				public void connectionOpened(NIOSocket nioSocket)
				{
					System.out.println("Sending login...");
					nioSocket.write(content);
				}
                //用于接收服务端的信息
				public void packetReceived(NIOSocket socket, byte[] packet)
				{
					try
					{
						// Read the UTF-reply and print it.
						String reply = new DataInputStream(new ByteArrayInputStream(packet)).readUTF();
						System.out.println("Reply was: " + reply);
						// Exit the program.
						System.exit(0);
					}
					catch (Exception e)
					{
						e.printStackTrace();
					}
				}
                //用于接受服务端连接发生异常时的处理方式
				public void connectionBroken(NIOSocket nioSocket, Exception exception)
				{
					System.out.println("Connection failed.");
					// Exit the program.
					System.exit(-1);
				}
			});
			// Read IO until process exits.
			//采用阻塞式读取IO信息,知道进程退出
			while (true)
			{
				service.selectBlocking();
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

}

 

 

 

代码如上有不解,希望大家可以沟通,谢谢!

分享到:
评论
2 楼 longgangbai 2011-11-15  
mjf112 写道
  public void notifyReadPacket(NIOSocket socket, byte[] packet)     
  {       
     socket.write(packet);     
  }   
请问这个向客户端写操作的方法什么时候被调用?
我在另一个线程中使用socket.write(packet);   向客户端写数据,不知道为什么连接的客户端多了以后数据就不能正常接收和发送了,请帮忙分析一下,谢谢。


不好意思,这个可能需要你在特定条件下,测试,我模拟不了你的环境。
1 楼 mjf112 2011-11-13  
  public void notifyReadPacket(NIOSocket socket, byte[] packet)     
  {       
     socket.write(packet);     
  }   
请问这个向客户端写操作的方法什么时候被调用?
我在另一个线程中使用socket.write(packet);   向客户端写数据,不知道为什么连接的客户端多了以后数据就不能正常接收和发送了,请帮忙分析一下,谢谢。

相关推荐

    NSGA2算法实例_naga2

    **NSGA-II(非支配排序遗传算法第二代)**是一种广泛应用在多目标优化问题中的算法,由Deb等人于2002年提出。...这个"NSGA2算法实例_naga2"提供了实践这一算法的机会,对于深入理解和应用多目标优化具有重要价值。

    Python-Naga基于Datalog的规则引擎

    Python-Naga是一个基于Datalog的规则引擎,它在Python开发环境中提供了一种强大的逻辑编程工具。Datalog是一种声明性编程语言,它源自于Prolog,主要用于处理数据查询和推理问题。Naga允许开发者定义一系列规则,...

    雷蛇熔岩naga1.13固件

    固件,全称为Firmware,是存储在电子设备中的非易失性程序代码,它控制设备的硬件操作,与操作系统和应用程序协同工作。对于雷蛇熔岩Naga鼠标来说,固件负责处理按键的响应、滚轮操作、DPI切换以及RGB照明效果等功能...

    naga2-allocate

    naga2的一个片段,其他片段待发中,先发一个求教一下

    基于naga开发的TCP客户端/服务器程序

    1、利用“naga-2_1-r42.jar”包进行二次开发; 2、调用NIOService类中的打开socket和serverSocket函数进行编程; 3、例如,服务器端: NIOService service1 = new NIOService(); NIOServerSocket ...

    NSGA2.rar_NAGA算法_NSGA2算法_matlab nsga2_naga2

    包含多目标遗传算法于深入了解NSGA及NAGA2算法有一定帮助

    nsga2.rar_NAGA算法_ism1j_naga ii_nsga2_nsga2算法代码

    该代码为naga2算法的完整版,可以在该代码上运行出自己想要的结果

    naga2-c语言

    c语言实现nsga2多目标遗传算法 算法步骤: 1)随机产生一个种群; 2)计算种群的适应度、最好适应度、最差适应度、平均适应度等指标; 3)验证种群代数是否达到自己设置的阈值,如果达到结束计算,否则继续下一步...

    Python库 | naga-0.2.6.1-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:naga-0.2.6.1-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Naga-Socket:Naga-Socket - Java 简单套接字

    所有这些都是从单个线程驱动的,使其对客户端(例如,允许 I/O 在 AWT 线程中完成而不需要任何线程)和服务器编程(所有连接的 1 个线程而不是 2 个线程/联系)。 Naga 在内部是一个简单的 NIO 实现,没有抛出任何...

    razer雷蛇naga hex v2鼠标驱动 v2.02 官方最新版

    nagahexv2驱动是专为该型号的游戏鼠标打造的驱动程序,有了它它以后,用户就可以对鼠标进行自定义的调节和设置了,还能触发更多的功能,欢迎有需要的朋友下载使用!雷蛇nagahexv2特色1.预设MOBA配置文件,助你提高对...

    Naga FM Radio-crx插件

    **Naga FM Radio-crx插件详解** Naga FM Radio-crx是一款专为网络广播爱好者设计的浏览器扩展程序,尤其适合那些热衷于英语广播的用户。这款插件以其便捷性和丰富的电台选择,使得用户在浏览网页的同时可以轻松收听...

    nsga2优化问题_naga2算法

    在提供的“nsga2优化1203”实例中,可以看到NSGA-II被应用于解决特定的实际问题。通过运行这个代码,我们可以观察到算法如何在多目标优化问题中逐步找到帕累托前沿的解集。例如,可能的应用场景包括工程设计、资源...

    naga:Naga是Go的最小但辣的服务框架

    naga是Go的简约服务框架。 通过组成共享的,可测试的,可重用的模块来构建服务。 package main import ( "github.com/octavore/naga/service" "github.com/octavore/nagax/web" ) func main () { service . Run ...

    雷蛇Razer那伽梵蛇熔岩特别版[Razer Naga Molten]鼠标驱动程序 v3.02 官方版

    雷蛇那伽梵蛇熔岩特别版鼠标驱动程序,专为其鼠标适配的官方最新驱动,装了驱动后可以更好的发挥鼠标性能。为游戏而生的那伽梵蛇系列外型较大,12个功能按键,5600DPI高分辨率。雷蛇(Razer)是全球顶级游戏外设品牌...

    雷蛇那伽梵蛇Razer Naga游戏鼠标驱动程序 v1.02.16 官方版

    雷蛇那伽梵蛇游戏鼠标驱动程序,专为其鼠标适配的官方最新驱动,装了驱动后可以更好的发挥鼠标性能。该鼠标性能出色,在配重,平衡及追踪表面的适应性需要有更好的提升,尽可能满足每一位玩家的精确需求。...

    雷蛇那伽梵蛇六芒星Razer Naga Hex游戏鼠标驱动程序 v1.02.16 官方最新版

    雷蛇那伽梵蛇六芒星游戏鼠标驱动程序,是为其鼠标配备的官方最新驱动,安装后能更好的发挥鼠标性能。 鼠标的正面采用了亮面的墨绿色设计,给人一种十分酷炫的感觉。鼠标带有很好的流线型设计,能够很好的贴合手掌,...

    test_naga:你好,世界

    在提到的压缩包文件“test_naga-main”中,"main"通常指的是主文件或主程序,这可能是整个项目或应用的入口点。在许多编程环境中,主文件负责启动和协调其他部分的执行。例如,在Java项目中,`main`函数所在的类是...

    Naga_KeypadMapper:这个小小的 linux xorg 守护进程允许您通过 $HOME.naga 下名为 mapping.txt 的配置文件映射 Razer Naga 系列鼠标的侧键盘

    Naga_KeypadMapper 这个小小的 linux xorg 守护程序允许您通过$HOME/.naga/下名为mapping_xx.txt的配置文件映射 Razer Naga 系列鼠标的侧键盘,需要: xdotool和 X 服务器环境才能工作。 目前测试: CentOS 7 中的 ...

Global site tag (gtag.js) - Google Analytics