`
生死格斗
  • 浏览: 127886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java NIO Socket的例子

阅读更多
package com.vista.Server;

import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;

public class SelectorServer 
{
    private static int DEFAULT_SERVERPORT = 6018;//默认端口
    private static int DEFAULT_BUFFERSIZE = 1024;//默认缓冲区大小为1024字节
    private static String DEFAULT_CHARSET = "GB2312";//默认码集
    private static String DEFAULT_FILENAME = "bigfile.dat";
    private ServerSocketChannel channel;
    private LinkedList<SocketChannel> clients;
    private Selector selector;//选择器
    private ByteBuffer buffer;//字节缓冲区
    private int port;
    private Charset charset;//字符集
    private CharsetDecoder decoder;//解码器
    
    
    public SelectorServer(int port) throws IOException
    {
        this.port = port;
        this.clients = new LinkedList<SocketChannel>();
        this.channel = null;
        this.selector = Selector.open();//打开选择器
        this.buffer = ByteBuffer.allocate(DEFAULT_BUFFERSIZE);
        this.charset = Charset.forName(DEFAULT_CHARSET);
        this.decoder = this.charset.newDecoder();
        
    }
    
     private class HandleClient 
     {
         private String strGreeting = "welcome to VistaQQ";
         public HandleClient() throws IOException 
         {
         }
         public String readBlock() 
         {//读块数据
             return this.strGreeting;
         }
         public void close() 
         {
             
         }
    }

    protected void handleKey(SelectionKey key) throws IOException
    {//处理事件
          if (key.isAcceptable()) 
          { // 接收请求
              ServerSocketChannel server = (ServerSocketChannel) key.channel();//取出对应的服务器通道
              SocketChannel channel = server.accept();
              channel.configureBlocking(false);
              channel.register(selector, SelectionKey.OP_READ);//客户socket通道注册读操作
          }
          else if (key.isReadable()) 
          { // 读信息
              SocketChannel channel = (SocketChannel) key.channel();
              int count = channel.read(this.buffer);
              if (count > 0) 
              {
                this.buffer.flip();
                CharBuffer charBuffer = decoder.decode(this.buffer);
                System.out.println("Client >>" + charBuffer.toString());
                SelectionKey wKey = channel.register(selector,
                    SelectionKey.OP_WRITE);//为客户sockt通道注册写操作
                wKey.attach(new HandleClient());
              } 
              else
              {//客户已经断开
                channel.close();
              }
              this.buffer.clear();//清空缓冲区
         }
         else if (key.isWritable()) 
         { // 写事件
              SocketChannel channel = (SocketChannel) key.channel();
              HandleClient handle = (HandleClient) key.attachment();//取出处理者
              ByteBuffer block = ByteBuffer.wrap(handle.readBlock().getBytes());
              channel.write(block);
             // channel.socket().getInputStream().(block);
//              PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
//                        channel.socket().getOutputStream())), true);
//              out.write(block.toString());

        }

    }
    public void listen() throws IOException
    { //服务器开始监听端口,提供服务
        ServerSocket socket;
        channel = ServerSocketChannel.open(); // 打开通道
        socket = channel.socket();   //得到与通到相关的socket对象
        socket.bind(new InetSocketAddress(port));   //将scoket榜定在制定的端口上
        //配置通到使用非阻塞模式,在非阻塞模式下,可以编写多道程序同时避免使用复杂的多线程
        channel.configureBlocking(false);    
        channel.register(selector, SelectionKey.OP_ACCEPT);
        try 
        {
            while(true) 
            {//     与通常的程序不同,这里使用channel.accpet()接受客户端连接请求,而不是在socket对象上调用accept(),这里在调用accept()方法时如果通道配置为非阻塞模式,那么accept()方法立即返回null,并不阻塞
                this.selector.select();
                Iterator iter = this.selector.selectedKeys().iterator();
                while(iter.hasNext())
                {
                    SelectionKey key = (SelectionKey)iter.next();
                    iter.remove();
                    this.handleKey(key);
                    
                }
            }
        } 
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }
    public static void main(String[] args) throws IOException 
    {
        System.out.println("服务器启动");
        SelectorServer server = new SelectorServer(SelectorServer.DEFAULT_SERVERPORT);
        server.listen(); //服务器开始监听端口,提供服务
    }

}




转自:http://www.cnblogs.com/phinecos/archive/2008/07/17/1245428.html
分享到:
评论

相关推荐

    java nio socket 例子

    本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成

    java NIO socket聊天室

    可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 2,运行client.bat启动客户端,可以打开编辑,ip,和端口号 3...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    描述中的“java nio 编程一个实例子.服务端程序”提示我们,这个实例是一个服务器端的应用,它利用Java NIO来处理客户端的连接请求。在NIO服务端编程中,通常会使用`Selector`来监听多个通道的事件,当有新的连接、...

    自己写的Java NIO 同步不阻塞IO操作

    描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...

    NIO socket编程小例子 加法服务器

    总结来说,"NIO socket编程小例子 加法服务器"是一个很好的学习NIO网络编程的起点。通过这个实例,我们可以了解NIO Channel、Buffer和Selector的基本用法,以及如何构建一个简单的网络通信应用。对于任何想要提升...

    java nio 通信服务器、客户端完整例子

    用java编写的nio通信的例子,nio是io编程的新版本,比io较流行。同时本例子是适用socket通信的。可以在此基础上,添加您的个人应用。本例子适用于:java通信的学习者,android平台通信的学习者。

    Java NIO原理 图文分析及代码实现

    ### Java NIO原理 图文分析及代码实现 #### 前言 在深入探讨Java NIO之前,我们先简要回顾一下NIO的概念及其引入的原因。随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在...

    java io 与java nio区别

    这个例子展示了如何使用传统的Java IO来实现一个服务器端的应用程序,它可以接收客户端发送的消息,并将接收到的信息原样返回给客户端。这里使用了`ServerSocket`和`Socket`来进行网络通信,通过`BufferedReader`来...

    有关Java的Socket编程入门例子

    通过这个入门例子,初学者可以理解Java Socket编程的基本原理和操作步骤,为进一步的网络编程打下坚实的基础。实际开发中,还可以结合NIO(非阻塞I/O)或其他高级框架如Netty,提高网络通信的效率和灵活性。

    java解读NIOSocket非阻塞模式宣贯.pdf

    在Java NIO中,Socket通信可以采用非阻塞模式,允许一个线程处理多个客户端连接,这对于高并发的网络应用尤其有益。 在给定的示例中,`HelloWorldServer`类展示了如何使用NIO创建一个非阻塞的服务器。以下是关键...

    Mina NIO Socket

    在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket的核心概念、工作原理以及在实际项目中...

    JAVA+Socket教程

    4. **NIO(非阻塞I/O)**:Java NIO库提供了非阻塞的I/O操作,适用于高并发的Socket通信场景。 5. **缓冲区管理**:使用ByteBuffer等NIO类可以更有效地管理内存缓冲区,提高性能。 以上内容只是Java Socket编程的...

    ssh.rar_NIO_java nio

    Java NIO,全称为New Input/Output,是Java在JDK 1.4版本...通过学习和实践这个例子,开发者不仅可以深化对Java NIO的理解,还能提升在网络编程和并发处理方面的技能,这对于构建高可用、高并发的分布式系统至关重要。

    java socket 客户端和服务端例子

    Java Socket是Java编程...总结来说,这个Java Socket例子展示了如何在Java中创建基本的客户端-服务器通信,特别是在处理中文数据时进行了优化。通过理解Socket的工作原理,我们可以构建出稳定、高效的网络应用程序。

    Java Socket传输图片源代码

    在Java编程语言中,Socket是实现网络通信的基础组件。...同时,这个例子也适合初学者作为入门教程,通过实际操作加深对Socket编程的理解。在实际开发中,可以结合其他技术,如多线程、NIO等,提升程序性能和稳定性。

    Java NIO原理和使用

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,...

    NIO 服务器客户端例子

    在这个"NIO 服务器客户端例子"中,`TestServer.java`和`TestClient.java`分别代表服务器端和客户端的实现。 **NIO服务器端(TestServer.java)的关键知识点:** 1. **选择器(Selector)**:服务器通常会创建一个...

    java-socket网络编程(tcp)

    在`Test_Socket_TCP`这个例子中,可能包含了客户端和服务端的简单示例代码,用于演示如何使用Socket进行TCP通信。 总结起来,Java Socket网络编程是基于TCP协议的,通过Socket和ServerSocket类进行连接管理和数据...

    Java基于Socket文件传输示例:服务器端和客户端

    在Java编程中,Socket是网络通信的基础,它允许两个网络应用程序之间进行双向通信。在这个示例中,我们将探讨如何使用Java的Socket实现文件传输,包括服务器端和客户端的实现细节。 首先,我们从服务器端开始。...

Global site tag (gtag.js) - Google Analytics