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获取到实际的通道对象

  • 相关阅读:
    java域名解析
    JDK8新特性面试
    java设计模式--单例模式
    EclipseEE导入项目出现的那些问题
    Eclipse配置Git发布项目到Github
    SVN本地服务器的搭建
    APK的反编译
    Oracle系列--级联删除和级联更新
    Oracle创建表空间和用户
    全方面了解和学习PHP框架 PHP培训教程
  • 原文地址:https://www.cnblogs.com/rgky/p/5452467.html
Copyright © 2011-2022 走看看