zoukankan      html  css  js  c++  java
  • java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程

    1、以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理

    2、以下代码使用了1.8新特性,如果要测试以下代码,java版本不能低于1.8

    3、如果发送的信息需要安全保护,也可以使用安全套接字,SSLSocket例子

    使用socket编程需要注意的两个方法,sendUrgentDatasetOOBInline;sendUrgentData是发送紧急数据用,只可以发送ASCII码,可用于判断远程链接是否断开;setOOBInline设置是否接收紧急数据,默认false丢弃,特别注意的是开启接收紧急数据,在获取数据时,没有区分普通数据与紧急数据方法的支持。

        // 客户端
        public static void main(String[] args) {
            try (Scanner scan = new Scanner(System.in);
                    Socket client = new Socket("127.0.0.1", 8484);
                    PrintWriter writer = new PrintWriter(client.getOutputStream());
                    BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));) {
                while (true) {
                    // writer.print(scan.nextLine() + "
    ");
                    // Writer 的 write(scan.nextLine() + "
    ");方法
                    // 注意:由于服务器端是使用readLine,如果是用上面两种方式写入,必须加换行符,否则readLine是读取不到数据的
                    writer.println(scan.nextLine());
                    writer.flush();
                    while (reader.ready()) {
                        System.out.println(reader.readLine());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 服务端
        public static void main(String[] args) {
            try (Scanner scan = new Scanner(System.in);
                    ServerSocket server = new ServerSocket(8484);
                    Socket sc = server.accept();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(sc.getInputStream()));
                    PrintWriter writer = new PrintWriter(sc.getOutputStream());) {
                while (true) {
                    writer.println(scan.nextLine());
                    writer.flush();
                    while (reader.ready()) {
                        System.out.println(reader.readLine());
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

     
    nio非阻塞socket通道编程
    这里简单介绍:参考源 http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html
    1、ServerSocketChannel 相当于封装的ServerSocket
    2、SocketChannel 相当于封装的Socket
    3、通过将ServerSocketChannel 与 SocketChannel 注册到选择器Selector中
    4、选择器中通过selector.select()线程堵塞的方式去获取有事件发生的Channel,类似于server.accept()的堵塞方式
    5、如果有事件发生,通过selector.selectedKeys()获取到所有发生事件的注册信息
    6、通过注册selectedKey获取到实际的通道对象

  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/rgky/p/5452467.html
Copyright © 2011-2022 走看看