`
AAries
  • 浏览: 39721 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

SocketChannel服务器端

阅读更多
package mailclass;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;

/**
 *
 * @author AAries zyz!
 */
public class Client extends Thread {

    private Selector selector;

    public Client(Selector selector) {
        this.selector = selector;

        Thread thread = new Thread(this);

        thread.start();;
    }

    @Override
    public void run() {
        try {
            while (selector.select() > 0) {
                // 遍历每个有可用IO操作Channel对应的SelectionKey
                Iterator it = selector.selectedKeys().iterator();
                while (it.hasNext()) {
                    SelectionKey sk = (SelectionKey) it.next();
                    it.remove();
                    // 如果该SelectionKey对应的Channel中有可读的数据
                    if (sk.isReadable()) {
                        // 使用NIO读取Channel中的数据
                        SocketChannel socketChannel = (SocketChannel) sk.channel();

                        ByteBuffer buffer = ByteBuffer.allocate(1024);
                        socketChannel.read(buffer);
                        buffer.flip();

                        // 将字节转化为为UTF-16的字符串   
                        String receivedString = Charset.forName("UTF-16").newDecoder().decode(buffer).toString();

                        // 控制台打印出来
                        System.out.println("接收到来自服务器" + socketChannel.socket().getRemoteSocketAddress() + "的信息:" + receivedString);

                        // 为下一次读取作准备
//                        sk.interestOps(SelectionKey.OP_READ);//将键设为可读

                    }
                    if (sk.isWritable()) {
                        SocketChannel socketChannel = (SocketChannel) sk.channel();
                        ByteBuffer writeBuffer = ByteBuffer.wrap("我的程序员之道".getBytes("UTF-16"));
                        socketChannel.write(writeBuffer);
                    }

                    // 删除正在处理的SelectionKey
                    selector.selectedKeys().remove(sk);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


调用类的写法
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mailclass;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;

/**
 *
 * @author AAries zyz!
 */
 class ClientTest {

    public static void main(String[] args) throws IOException {
        SocketChannel sc = SocketChannel.open(new InetSocketAddress("172.16.22.11", 5200));
        //打开一耳光SocketChannel并连接
        sc.configureBlocking(false);

        Selector selector = Selector.open();

        sc.register(selector, SelectionKey.OP_READ);
        //注册一个selector此时为空
        
        Client client = new Client(selector);
        //打开一个线程,如遇到可读的包则读取,如遇到可写的包,则写!
        
        ByteBuffer writeBuffer=ByteBuffer.wrap("我的程序员之道".getBytes("UTF-16"));
        sc.write(writeBuffer);
        
                
    }
}

分享到:
评论

相关推荐

    java SocketChannel通信实例

    `SocketSelectorServer`和`SocketSelectorClient`是源代码文件,它们展示了如何使用SocketChannel和Selector实现服务器端和客户端的通信。服务器端通常会创建一个Selector,然后注册SocketChannel,监听客户端的连接...

    java的ServerSocketChannel与SocketChannel的使用

    1. 打开`SocketChannel`:在服务器端,由`ServerSocketChannel.accept()`返回;在客户端,通过`java.nio.channels.SocketChannel.open()`获取。 2. 配置为非阻塞:`SocketChannel`默认是阻塞模式,可以调用`...

    SocketChannel、ServerSocketChannel与Selector的实际案例

    2. **ServerSocketChannel**:这个类代表了一个服务器端的套接字,用于监听客户端的连接请求。创建ServerSocketChannel后,我们需要将其绑定到特定的IP地址和端口号,然后调用`accept()`方法来接受新的连接。每个...

    netty4 Android客户端和服务器端

    在本文中,我们将深入探讨如何使用 Netty 4.0.31.Final 版本构建 Android 客户端和服务器端应用程序。 首先,Netty 提供了一种简化网络编程的方式,它通过非阻塞 I/O 和 Channel 抽象来处理并发连接。在 Android 上...

    Java NIO服务器端开发详解

    Java NIO 服务器端开发详解 Java NIO 服务器端开发是 Java 语言中的一种高性能的 I/O 模式,提供了非阻塞式的 I/O 操作,能够提高服务器端的性能和可扩展性。下面是 Java NIO 服务器端开发的详细介绍: 一、NIO ...

    java nio Selector的使用-服务器端

    在服务器端,Selector的应用尤为重要,因为它可以实现单线程处理多个客户端连接,从而提高系统的并发能力。 Selector的工作原理: Selector通过注册Channel(通道)到自己身上,当注册的通道上发生指定的事件时,...

    Java-NIO非阻塞服务器示例.docx

    ServerSocketChannel和SocketChannel是NIO包中的两个重要的Channel接口,分别用于服务器端和客户端的连接。ServerSocketChannel用于监听客户端的连接请求,而SocketChannel用于与客户端进行通信。 五、ByteBuffer...

    java -> QuickServer 新建 TCP 服务器端

    在Java编程环境中,创建一个TCP服务器端是一项基本任务,尤其对于网络编程和分布式系统开发者而言。QuickServer是一款轻量级的Java服务器框架,它简化了TCP服务器的开发过程。本篇将详细介绍如何利用QuickServer来...

    使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket

    ServerSocketChannel是NIO中的服务器端通道,它可以监听客户端的连接请求。创建ServerSocketChannel并绑定到指定的端口后,通过调用`accept()`方法,非阻塞地接收新的SocketChannel连接。与传统ServerSocket不同,...

    【IT十八掌徐培成】Java基础第27天-02.NIO-ServerSocketChannel-SocketChannel.zip

    ServerSocketChannel是Java NIO中用于服务器端监听客户端连接的通道。通过调用`ServerSocketChannel.open()`方法可以创建一个ServerSocketChannel对象,然后通过`bind()`方法绑定到指定的IP和端口上。当有客户端...

    NIO聊天室代码

    3. **设置非阻塞**:为了支持并发,服务器端需要将`SocketChannel`设置为非阻塞模式。 4. **创建缓冲区**:创建`ByteBuffer`实例,用于存储接收到的数据。 5. **读取和写入**:使用`read()`方法从通道读取数据到缓冲...

    Socket通信Java代码

    2. 服务器端:服务器端通过创建`ServerSocket`实例监听特定端口,等待客户端的连接请求。一旦有客户端连接,服务器端就会创建一个Socket对象来处理这个连接。 3. 客户端:客户端通过`Socket`类创建一个Socket实例,...

    NioSocket,包括server端和client端

    NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...

    NIO 经典实例

    本实例将深入探讨NIO在服务器端和客户端的应用,通过`NioDemoServer.java`和`NioDemoClient.java`这两个文件来解析NIO的核心知识点。 1. **NIO基础** NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...

    实现java网络与nio例子

    - 客户端首先需要创建一个SocketChannel,通过`SocketChannel.open()`打开,并使用`SocketChannel.connect(SocketAddress)`连接到服务器端的地址。 - 同样,客户端也需要使用缓冲区进行数据的读写操作。 - 如果...

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

    在"sumsever+client"这个压缩包中,你应该能找到对应的服务器端和客户端源代码文件,通过阅读和运行这些代码,你可以更深入地理解NIO在实际网络编程中的应用。 总结来说,"NIO socket编程小例子 加法服务器"是一个...

    NIO简易服务器框架、文件传输

    首先,让我们来看看服务器端的设计。服务器端的核心是建立一个基于NIO的服务器,它通常包含以下组件: 1. **选择器(Selector)**:选择器是NIO的核心,用于监听多个通道(Channels)上的事件,如连接请求、数据...

    Socket实现聊天室功能

    在这个案例中,我们将讨论如何使用Socket来实现一个简单的聊天室功能,包括服务器端和客户端的实现。 首先,我们要理解Socket的基本概念。Socket是网络通信中的一个抽象接口,可以看作是两台计算机之间的通信通道。...

    Neety服务器与客户端简单案例

    在服务器端,我们需要创建一个ServerBootstrap,配置好ServerSocketChannel,并设置合适的ChannelInitializer来处理新连接。ChannelInitializer的作用是在建立连接时初始化新的Channel,添加必要的ChannelHandler。...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    4. 服务器端通过选择器监控到可读事件,从SocketChannel读取缓冲区数据,解析出消息内容。 5. 如果服务器需要向客户端发送消息,过程类似,只是方向相反,服务器将消息写入缓冲区,然后通过SocketChannel的`write()`...

Global site tag (gtag.js) - Google Analytics