`
youzifei
  • 浏览: 66833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SocketChannel 例子

阅读更多
这几天在看mina 
mina 基于socketChannel 和 DatagramChannel 建立的无阻塞链接。

所以就看了看socket channel 的使用方式,做一份备忘吧。
socketChannel 的使用方式

server端

package com.jimmy.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Date;

public class TestServerSocketChannel {
    public static void main(String[] args) throws IOException {
        int port=37;

        ByteBuffer in=ByteBuffer.allocate(4);
        ByteBuffer out=ByteBuffer.allocate(8);
       
        //设置绑定端口
        SocketAddress address=new InetSocketAddress(port);

        //Opens a server-socket channel.
        ServerSocketChannel serverSocketChannel=ServerSocketChannel.open();

        //Binds the ServerSocket to a specific address (IP address and port number).
        serverSocketChannel.socket().bind(address);

        System.err.println("bound to " + address);
       
        //Accepts a connection made to this channel's socket
        SocketChannel channel=serverSocketChannel.accept();
        if(channel == null) {
            return;
        }
        //clear byte buffer
        in.clear();
        //read byte to "in" buffer
        channel.read(in);
        //Flips this buffer
        in.flip();
        int a=in.getInt();
        System.out.println("a:" + a);

        //get remote socket address
        SocketAddress client=channel.socket().getRemoteSocketAddress();
        System.err.println(client);
        long secondsSince1970=System.currentTimeMillis();

        //clear "out" byte buffer
        out.clear();
        //put currentTimeMillis value into "out" byte buffer
        out.putLong(secondsSince1970);
        //Flips this buffer
        out.flip();

        //Writes a sequence of bytes to this channel from the given buffer
        //write data from position to limit of buffer
        //so before write ,buffer need call flip method
        channel.write(out);

        channel.close();

        serverSocketChannel.close();
    }
}



client 端

package com.jimmy.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Date;

public class TestClientSocketChannel {

    public static void main(String[] args) throws IOException {
        int port=37;
        SocketChannel channel=SocketChannel.open();
        SocketAddress server=new InetSocketAddress("192.168.1.79", port);
        channel.connect(server);

        ByteBuffer buffer=ByteBuffer.allocate(4);
        ByteBuffer readBuffer=ByteBuffer.allocate(8);
       
        // send a byte of data to the server
        buffer.putInt(100);
        buffer.flip();
        channel.write(buffer);

        // get the buffer ready to receive data
        channel.read(readBuffer);
        readBuffer.flip();

        // convert seconds since 1900 to a java.util.Date
        long currentTimeMillis=readBuffer.getLong();

        Date time=new Date(currentTimeMillis);

        System.out.println(time);

        channel.close();
    }
}



socket channel 操作的对象是ByteBuffer
在read的时候如果byte length 超过了 byteBuffer分配的空间 会抛出java.nio.BufferUnderflowException 异常。
在设置 bytebuffer 空间的时候建议设置大一些。
分享到:
评论

相关推荐

    实现java网络与nio例子

    这个例子包含了NIO在网络通信中的应用,包括服务器端(Server)和客户端(Client)的实现。 在Java NIO中,核心组件有通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的途径,如套接字...

    一个java NIO的例子

    - 处理读写事件,将数据从SocketChannel读入缓冲区,或者将缓冲区的数据写入SocketChannel。 - 关闭不再使用的通道和选择器。 总的来说,Java NIO提供了一种高效、灵活的I/O模型,尤其适合处理高并发的网络应用。这...

    JAVA nio的一个简单的例子

    在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...

    NIO 服务器客户端例子

    1. **套接字通道(SocketChannel)**:客户端通过`SocketChannel.open()`创建通道,并用`socketChannel.connect(new InetSocketAddress(serverAddress, serverPort))`连接到服务器。 2. **缓冲区(Buffers)**:NIO...

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

    当客户端连接请求到达时,服务器会通过accept()方法获取一个新的SocketChannel,用于与该客户端通信。然后,服务器会注册这个SocketChannel到Selector,并设置感兴趣的事件(如OP_READ)。当Selector轮询到可读事件...

    socket编程例子

    在这个例子中,我们关注的是使用Non-blocking I/O(NIO)的Socket通信,这是一种提高性能和效率的方式,因为它允许单个线程处理多个连接。 在Java中,Socket接口代表了网络上的两个应用程序间的双向通信链路。而NIO...

    TestNetty 一个小例子

    5. **客户端连接**:Bootstrap 配置好 EventLoopGroup、SocketChannel 类型以及 ChannelInitializer 后,connect() 方法发起连接请求。 在 TestNetty 的源代码中,可能会包含一个简单的 Echo 服务示例,即客户端...

    Mina实现RPC的例子

    这个例子中的链接(http://blog.csdn.net/stevexk/archive/2008/07/23/2697907.aspx)提供了更详细的实现细节,包括具体的编码和解码逻辑,以及如何在Mina的过滤器和处理器中处理RPC请求。如果你需要深入学习,建议...

    Netty 聊天 例子

    在本“Netty 聊天例子”中,我们将深入探讨如何利用 Netty 构建一个简单的聊天应用,这对于初学者来说是一个很好的起点。 **Netty 基础** Netty 的核心组件包括 Channel、Bootstrap、Pipeline 和 EventLoopGroup。...

    一个NIO服务端,客户端的例子

    客户端则会创建Bootstrap实例,设置通道工厂,通常是NioSocketChannel。同样地,客户端也需要配置管道,其中包含一个ByteToMessageDecoder和一个ClientBusinessHandler,后者负责与服务器交互的逻辑。 在启动服务器...

    netty入门例子--(不是翻译官方文档)

    这个“netty入门例子”旨在帮助初学者理解Netty的基本用法和特性,而不是简单地翻译官方文档,它提供了几个开发模板,以便于深入理解Netty中的消息异步通信机制和TCP通信的封装。 首先,Netty的核心是它的异步模型...

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

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

    非阻塞通信例子【nonblocking】示例

    2. **客户端**:通过`SocketChannel`建立连接,向服务器发送数据。 3. **数据读写**:服务器和客户端都会使用`ByteBuffer`作为缓冲区,用于数据的读写。在非阻塞模式下,`read()`和`write()`方法不会立即返回,而是...

    netty4服务端客户端实例

    对于客户端,我们同样使用`Bootstrap`,但配置的是`SocketChannel`而不是`ServerSocketChannel`。客户端也需要一个`EventLoopGroup`来处理I/O事件,然后在管道中添加自定义的处理器,连接到服务端并发送数据: ```...

    用Netty5写一个简单的服务端和客户端.rar

    public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new MyServerHandler()); } }); b.bind(PORT).sync(); ``` 客户端使用Bootstrap来创建连接,同样配置ChannelHandler,但...

    netty基于protobuf的简单示例

    protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); p.addLast(new ProtobufVarint32FrameDecoder()); p.addLast(new ProtobufDecoder(Greeting....

    socket 长连接 多线程 心跳包 包头包体

    socket 长连接 简单例子,适合初学的朋友,里面有多线程 实现的,包括心跳包,数据分为两部分传送,首先双方约定用一个4字节的数组告诉对方要传送数据的长度,然后在写入数据,这样长连接的时候,双方可以知道对方...

    netty 例子

    例如,SocketChannel 代表了一个 TCP 连接,DatagramChannel 用于 UDP 协议。 3. **EventLoop** 和 **EventLoopGroup**:EventLoop 负责处理 Channel 上的 I/O 事件,它是 Netty 的单线程执行单元。EventLoopGroup ...

    咕泡学院_Tom_JavaVIP课程_深入分析Netty源码1

    在这个例子中,使用了NioEventLoopGroup,它是基于非阻塞I/O(NIO)的事件循环组,负责监听和处理连接的读写事件。每个EventLoopGroup包含多个EventLoop,每个EventLoop可以处理多个通道(Channel)。 2. **...

    Android MiNa 通讯实现

    这个例子将详细介绍如何在Android环境中实现MiNa进行文本传输。 ### 1. MiNa核心概念 MiNa基于Java的NIO(Non-blocking I/O)模型,提供了事件驱动、非阻塞I/O的网络通信库。主要包含以下几个核心组件: - **...

Global site tag (gtag.js) - Google Analytics