`

Java NIO连接socket

    博客分类:
  • j2se
阅读更多
NIO连接socket
一个是服务器端,一个是客户端,都是用NIO连接的,代码如下
package testnio;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Set;

 
public class Receive {

    public static void main(String[] args) throws Exception {
        boolean b = true;
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        ServerSocketChannel ss = ServerSocketChannel.open();
        ss.socket().bind(new InetSocketAddress(8888));
        ss.configureBlocking(false);
        Selector se = Selector.open();
        ss.register(se, SelectionKey.OP_ACCEPT);
        while (se.select() > 0) {
            Set<SelectionKey> set = se.selectedKeys();
            System.out.println("进入一个循环,大小是:" + set.size());
            for (SelectionKey key : set) {
                int ops = key.readyOps();
                System.out.println("ops=" + ops);
                if ((ops & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
                    SocketChannel sc = ss.accept();
                    System.err.println("有新的连接了" + sc);
                    System.err.println("地址是:" + sc.socket());
                    sc.configureBlocking(false);
                    sc.register(se, SelectionKey.OP_READ);
                }
                if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                    System.err.println("有新的读取");
                    SocketChannel sc = (SocketChannel) key.channel();
                    System.out.println(sc.isConnected());
                    sc.read(buffer);
                    buffer.flip();
                    //System.out.println(new String(buffer.array()));
                    Thread.sleep(5000);
                    if (b) {
                        b = false;
                        sc.write(buffer);
                    }

                }
            }
            set.clear();
            System.out.println("退出循环");
        }

    }
}

客户端:
package testnio;

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;

 
public class Send {

    public static void main(String[] args) throws Exception {
        SocketChannel sc = SocketChannel.open();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        Selector se = Selector.open();
        buffer.put("我是中国人,我爱我的祖国,hadeslee".getBytes());
        buffer.flip();
        
        sc.configureBlocking(false);
        sc.register(se, SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE);
        sc.connect(new InetSocketAddress("172.0.0.1", 8888));
        while(!sc.finishConnect());
        sc.write(buffer);
        System.out.println("进入循环");
        Thread.sleep(10000);
        int sum = se.select();
        while (se.select() > 0) {
            Thread.sleep(100);
               
                System.out.println("终于大于0了");
                Set<SelectionKey> set = se.selectedKeys();
                System.out.println("大小是:"+set.size());
                for (SelectionKey key : set) {
                    int ops = key.readyOps();
                    if ((ops & SelectionKey.OP_CONNECT) == SelectionKey.OP_CONNECT) {
                        sc.write(buffer);
                        System.out.println("连接成功");
                    }
                    if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                        System.out.println(" 收到东西");
                        sc.read(buffer);
                        buffer.flip();
                        System.out.println("收到的是:" + new String(buffer.array(),0,buffer.limit()));
                        sc.write(buffer);
                    }
                }
               se.selectedKeys().clear();
        }
    }

    private static ByteBuffer[] get(String heads) {
        ByteBuffer[] bbs = new ByteBuffer[heads.length];
        for (int i = 0; i < bbs.length; i++) {
            String s = heads[i];
            bbs[i] = ByteBuffer.allocateDirect(1024);
            bbs[i].put(s.getBytes());
            bbs[i].flip();
        }
        return bbs;
    }
}
分享到:
评论

相关推荐

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

    java NIO socket聊天

    java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低

    java多路复用socket客户端.

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个...

    java nio教程pdf

    信息来自http://ifeve.com/server-socket-channel/ Java NIO: Channels and ...Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv...

    java socket客户端断线重连

    java socket client 断线重连的简单实现 有什么意见可以提哦

    java socketNIO 实现多客户端聊天室 代码

    利用socketNIO实现的多客户端聊天室,非阻塞式IO,java代码编写,使用方法:先启动服务端代码再启动客户端代码,可启动多个客户端代码。若使用多个电脑启动客户端,需在客户端代码中更改一下ip地址。

    tcp.zip_java Tcp _java nio_java nio TCP_tcp_tcp java

    TCP NIO socket TCP服务器,支持多个客户端连接

    默蓝网络通信测试工具(NIOSocket工具)支持TCP/IP和HTTP通信-网络通信开发人员必备

    网络通信工具,服务端和客户端连接测试工具,可单条发送,循环发送,模拟多客户端发送,本工具可以作为网络通信工具或压力测试工具, Java NIO Socket编程,需JAVA运行环境

    Socket长连接+心跳包+发送读取

    Socket长连接+心跳包+发送+读取,用到的全在这里了,自己看看哪里不需要的就不要添加了!代码很清晰很明白了!

    Java NIO 聊天室 JSwing

    import java.nio.channels.SocketChannel; import java.util.Iterator; import com.nio.user.ClientUser; import com.nio.user.ClientUserManager; import com.nio.user.UserData; public class NIOClient { ...

    基于javatcpsocket通信的拆包和装包源码-niochatroom:基于Javanio的聊天室

    基于java tcp socket通信的拆包和装包源码 功能 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2)实现多人群聊 3)服务器端:可以监测用户上线,离线,并实现消息转发功能 4)客户端:...

    用Java实现非阻塞通信

    java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。 ● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。 ● Selector:为...

    java常用代码

    6.NioFile.java nio操作文件读写 7.ImageThumbnail.java 生成图片缩略图 8.JsonObjs.java json简单操作 9.HttpProxy.java 代理设置 10.CaptureScreen.java 截取桌面 11.XmlReaer.java 读写xml文件 12.ArrayConvers...

    从NIO到Netty,编程实战出租车905协议-08172347.pdf

    第3章,结合905.4-2014协议的基本内容,动手实现NIO长连接服务端的实现,以及协议内容的设计和实现思路; 第4章,实现长连接客户端,以及采用多线程技术进行系统性能测试; 第5章,介绍Netty相关基础知识,并使用...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    NULL 博文链接:https://sariel.iteye.com/blog/470383

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

    Naga 的目标是成为一个非常小的 NIO 库,它提供了一些 java 类来用异步 NIO 对应物(类似于为 Java 1.7 计划的 NIO2)包装通常的 Socket 和 ServerSocket。 所有这些都是从单个线程驱动的,使其对客户端(例如,...

    Android-netty和socket通信的demo

    Netty是基于Java NIO client-server的网络应用框架,使用Netty可以快速开发网络应用

    Java CP/IP Socket编程

    JAVA SOCKET 编程的经典之书,(中文版)里面的代码可直接复制使用! 目录: 第1章简介..........3 1.1 计算机网络,分组报文和协议..........3 1.2 关于地址..........6 1.3 关于名字..........8 1.4 客户端...

Global site tag (gtag.js) - Google Analytics