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() + "\n");
                // Writer 的 write(scan.nextLine() + "\n");方法
                // 注意:由于服务器端是使用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获取到实际的通道对象

posted @ 2016-05-02 15:46  べ袽猓柯苡づ  阅读(1374)  评论(0编辑  收藏  举报