`
落叶留步
  • 浏览: 53303 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

2.java nio 网络编程 client端

 
阅读更多

   前面写了nio 网络 server端,这里是client端,只写了简单的发送接收数据,最后关闭连接。大文本发送和接手参考server端写法就行了。

   

    不过这里有个异常,客户端这边调用socketChannel的close方法以后,服务端继续使用这个channel的话,会抛出异常。所以在server端需要检查,socketChannel.read(rb)这个方法会返回一个整数,当返回的数大于-1的时候,表示这个socketChannel没有close,当socketChannel调用close方法以后,会返回-1,这时候,就不要操作这个socketChannel还有不要调用SelectionKey的interestOps方法,这里面也会用到这个socketChannel

   

package com.govert.project;

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;
import java.util.Set;

/**
 * Created by govert on 2016/8/21.
 */
public class NioClient {

    public static void main(String[] args) throws IOException {
        // read and write byte buffer
        ByteBuffer rb = ByteBuffer.allocate(1024);
        ByteBuffer wb = ByteBuffer.allocate(1024);

        // connect hostname and port
        String hostname = "127.0.0.1";
        int port = 9000;

        // open Selector & check
        Selector selector = Selector.open();
        if (selector.isOpen()) {
            System.err.println("Selector open success.");
        }

        // open SocketChannel & check
        SocketChannel socketChannel = SocketChannel.open();
        if (socketChannel.isOpen()) {
            System.err.println("SocketChannel open success.");
        }

        // config non-block & connect
        socketChannel.configureBlocking(false);
        socketChannel.connect(new InetSocketAddress(hostname, port));

        // socketChannel register selector
        socketChannel.register(selector, SelectionKey.OP_CONNECT);

        // hand event loop
        boolean isExit = false;
        while (!isExit) {

            selector.select();

            Set<SelectionKey> keys = selector.selectedKeys();
            for (SelectionKey key : keys) {
                if (key.isReadable()) {

                    rb.clear();
                    socketChannel.read(rb);
                    rb.flip();
                    System.err.println(new String(rb.array(), 0, rb.limit(), "utf-8"));


                    // key.interestOps(SelectionKey.OP_WRITE);
                    //
                    key.cancel();
                    socketChannel.close();
                    isExit = true;
                } else if (key.isWritable()) {

                    String req = "hello server, i am from client.";
                    wb.clear();
                    wb.put(req.getBytes("utf-8"));
                    wb.flip();
                    socketChannel.write(wb);

                    key.interestOps(SelectionKey.OP_READ);
                } else if (key.isConnectable()) {
                    socketChannel.finishConnect();

                    System.err.println("client connect server success.");

                    key.interestOps(SelectionKey.OP_WRITE);
                }
            }

            //
            keys.clear();
        }

    }
}

 

分享到:
评论

相关推荐

    java多线程Client/Server程序

    在Java编程领域,多线程Client/Server程序是网络编程中的一个重要组成部分,它允许服务器同时处理多个客户端的请求。在本程序中,`ChatServer.java` 和 `ChatClient.java` 文件可能分别代表了服务器端和客户端的核心...

    基于java NIO的socket通信demo

    在`NioClient.java`中,客户端同样使用NIO进行通信。客户端首先创建一个`SocketChannel`,然后向服务器的`ServerSocketChannel`发起连接请求。接着,客户端可以设置自己的`Charset`来确保数据在传输过程中不出现乱码...

    JAVA-NIO程序设计完整实例

    - **网络通信优化**: 在网络编程中,通过NIO的非阻塞模式,可以更有效地处理网络数据的读写。 ### 5. 示例代码片段 ```java Selector selector = Selector.open(); ServerSocketChannel server = ...

    java socket nio 研究

    Java Socket和NIO(Non-blocking Input/Output,非阻塞I/O)是Java网络编程中的重要组成部分,它们在处理高并发、低延迟的网络服务时展现出强大的能力。本篇文章将深入探讨这两个概念,并通过示例代码`...

    java nio聊天室源码

    Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞I/O操作的能力,极大地提升了Java在...通过分析和学习这个源码,开发者可以深入理解Java NIO的工作原理,并将其应用于实际的网络编程项目中。

    nio socket编程java代码示例,客户端发送消息,服务端接收

    本示例将详细解析如何使用Java的非阻塞I/O(NIO)实现Socket通信,包括客户端发送消息和服务器端接收消息的过程。 首先,理解NIO(Non-blocking Input/Output)的概念至关重要。NIO与传统的IO模型不同,它提供了对...

    实现java网络与nio例子

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 ...这个"网络与nio"的压缩包文件很可能包含了服务器端和客户端的完整代码示例,可以帮助我们深入理解并实践Java NIO在网络编程中的应用。

    网络编程小测试

    本测试聚焦于Java语言的网络编程,其中包含了两个关键文件:Server.java和Client.java,这通常代表了一个简单的服务器-客户端架构。 1. **Java网络编程基础**:Java提供了丰富的API来处理网络通信,主要在`java.net...

    java网络编程 源代码

    Java网络编程是Java开发中的重要领域,特别是在分布式系统、服务器端应用和互联网服务开发中扮演着核心角色。孙卫琴的这部作品深入浅出地介绍了Java进行网络编程的基础知识和实践技巧,对于初学者来说是一份很好的...

    java NIO 开发技术

    总的来说,Java NIO通过非阻塞I/O和选择器机制,实现了更加高效和可扩展的网络编程模型,特别适合处理大量并发连接的情况,如Web服务器、分布式系统等。理解和掌握NIO的原理和使用,对于优化高性能服务器端程序具有...

    Client-Server-App.zip_between_client

    为了优化服务器性能,服务器端可能采用了多线程或异步I/O模型(如Java NIO)来处理多个客户端请求,以提高并发处理能力。 综上所述,这个压缩包提供的代码示例涉及了客户端-服务器应用开发的基础,包括TCP/IP通信...

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

    Java NIO(Non-blocking Input/...在实际开发中,Java NIO的使用需要对多线程、网络编程以及NIO API有深入的理解。通过这种方式构建的系统可以高效地处理大量并发连接,非常适合于聊天、游戏等实时性要求高的应用场景。

    Java socket网络编程的基础示例

    Java Socket网络编程是Java平台中实现网络通信的核心技术,它基于传输层协议TCP和UDP,为应用程序提供了低级别的、原始的比特流服务。本基础示例将深入探讨这两种协议下的Socket编程。 首先,TCP(Transmission ...

    NioSocket,包括server端和client端

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

    Java NIO原理分析及代码实例

    Java NIO(New Input/Output)是Java标准库提供的一种I/...了解和熟练使用Java NIO对于优化I/O密集型应用的性能至关重要,特别是在网络编程和高并发场景下。通过合理的使用NIO,开发者可以构建出更加高效、灵活的系统。

    java网络编程总结

    在Java网络编程中,我们还需要了解异常处理、套接字选项、多路复用技术如Java NIO(非阻塞I/O)以及SSL/TLS安全通信等高级主题。此外,对于B/S架构,我们通常使用Servlet、JSP和相关框架(如Spring MVC)来开发Web...

    java NIO 学习 聊天室程序 (3)

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,是对传统IO模型的重大改进。在传统的IO模型中,数据传输基于字节流...同时,通过分析源代码,你将能更好地掌握NIO在实际项目中的应用,提升你的Java并发编程技能。

    JAVA 网络编程之QQ 项目编程实训

    1. **Java Socket编程**:Socket是网络编程的基础,Java中的Socket类和ServerSocket类提供了客户端与服务器端的通信接口。在QQ项目中,我们将用到它们来建立TCP连接,实现客户端与服务器端的数据传输。 2. **并发...

    【IT十八掌徐培成】Java基础第27天-04.NIO-Selector-Server-Client.zip

    课程中的视频文件"Java基础第27天-04.NIO-Selector-Server-Client.avi"很可能包含了实际的代码演示和讲解,帮助学习者直观理解Selector的工作原理以及如何在Java中实现NIO服务器和客户端的交互。通过观看视频和动手...

    浅谈java中nio的使用方式

    Java NIO(New Input/Output)是一种用于处理I/O操作的非阻塞I/O模型,与传统的Java IO相比,它提供了更高的性能和更灵活的编程方式。NIO的核心概念包括Channel、Selector、SelectionKey和Buffer。 1. **Channel...

Global site tag (gtag.js) - Google Analytics