java socket编程 基于阻塞,NIO,AIO

[TOC]

随着深入学习java的分布式和后台,对于java 实现socket有着很深兴趣,要仔细了解一下,这篇文章就是深入理解java socket编程

  • 多线程,每个线程一次处理一个请求,在当前请求处理完成之前不会接收其它请求;但在高并发环境下,多线程的开销比较大;
  • 基于回调的异步IO,如Nginx服务器使用的epoll模型,这种模式通过事件驱动的方式使用异步IO,使服务器持续运转,但人的思维模式是串行的,大量回调函数会把流程分割,对于问题本身的反应不够自然;
  • 协程,不需要抢占式调度,可以有效提高线程的任务并发性,而避免多线程的缺点;但原生支持协程的语言还很少。

socket介绍

在前面的socket原理:(赶快点击) 中有详细介绍,这里就不再做解释了

基于java自身包的socket就是使用BIO(阻塞式),NIO非阻塞式编程

“`java
Socket(InetAddress address,int port);//创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket(String host,int port);//创建一个流套接字并将其连接到指定主机上的指定端口号
Socket(InetAddress address,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程地址上的指定远程端口
Socket(String host,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程主机上的指定远程端口
Socket(SocketImpl impl);//使用用户指定的 SocketImpl 创建一个未连接 Socket
ServerSocket(int port);//创建绑定到特定端口的服务器套接字
ServerSocket(int port,int backlog);//利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号
ServerSocket(int port,int backlog, InetAddress bindAddr);//使用指定的端口、侦听 backlog 和要绑定到的本地 IP地址创建服务器


## BIO socket ```java 客户端: String host="127.0.0.1"; int port=10086; Socket socket=null; try { socket=new Socket(host, port); OutputStream out=socket.getOutputStream(); InputStream in=socket.getInputStream(); DataInputStream dataInputStream=new DataInputStream(in); DataOutputStream dataOutputStream=new DataOutputStream(out); while(true){ String s=in1.nextLine(); dataOutputStream.writeUTF(s); //System.out.println(s+"zai ke huduan"); String reponse=dataInputStream.readUTF(); if(!reponse.equals("")) System.out.println(reponse); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

服务器端使用多线程即可 在run中进行

 while(true ){
                Socket socket=serverSocket.accept();
                ThSer server=new ThSer(socket);
                Thread tt=new Thread(server);
                tt.start();
            }

NIO socket


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注