Java网络编程
指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来。
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通讯。通常用于互联网协议,又被称为TCP/IP
UDP :UDP是用户数据包协议的缩写,一个无法连接的协议。提供应用程序之间要发送的数据的数据包。
Socket编程(套接字)
服务器实例一个ServerSocket对象,表示通过服务器上的端口通信。
服务器调用ServerScoket类的accept()方法,即一直等待客户端连接
服务器在等待时,客户端实例化一个Socket对象明知道服务器的名称和端口号请求连接。
Socket 类构造函数试图将客户端连接到指定的服务器和端口。
在服务端,accept()方法返回服务器上一个新的socket 引用,该socket连接到客户端socket。
同步和异步
同步和异步是针对应用程序和内核交互而言的,同步指用户进程触发io操作并等待或者轮询去查看io操作(即对一些数只能一个个访问,安全)。异步是指用户进程触发io操作以后便开始做自己是事情,当io操作完成时候反馈。
阻塞和非阻塞
阻塞和非阻塞是针对于进程在访问数据的时候,根据io操作的就绪状态采取不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入方式会立即返回一个状态值。
BIO编程
Blocking IO :同步阻塞的编程式
BIO编程方式:在服务端启动一个serversocket来金童网络请求,客户端启动socket发起网络请求,默认下serversocket会建立一个线程来处理次请求,若是服务端没有线程可用,客户端则会阻塞等待或遭到拒绝。
NIO编程:
NIO:同步非阻塞的编程方式
是基于事件驱动思想来完成的,其主要思想解决的是BIO的大并发问题,BIO基于Reactor,但socket有流动可读写入socket时,操作系统会相应的通知引用程序进行处理,应用在将流读取到缓冲区或写入操作系统。不是一个连接对应一个处理线程,而是有效的请求,对应一个线程,当没有数据时,是没有工作线程来处理的。
AIO编程
Asynchronize IO异步非阻塞编程式
当进行读写操作时,只需要直接调用API的read或者write方法即可,这两种方法均为异步的,对于读操作时,当有可读时,操作系统会将可读的流入read方法的缓冲区,并通知应用程序,对于写,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
客户端
package JavaDmo; /* * @Filename : ClientSocket.java * @author:xuandc * @Time :2020-03-25 */ import java.io.*; import java.net.Socket; import java.net.UnknownHostException; public class ClientSocket { public static void main(String[] args) throws IOException { String serverName = "127.0.0.1"; int port = Integer.parseInt("6666"); try { System.out.println("连接到主机:" + serverName + " ,端口号:" + port); Socket client = new Socket(serverName, port); System.out.println("远程主机地址:" + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("服务器响应: " + in.readUTF()); }catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
服务器端
package JavaDmo; /* * @filename:ServerScoket.java * @author: xuandc * @Time : 2020-03-26 **/ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerSockett extends Thread{ private ServerSocket serverSocket; public ServerSockett(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public static void main(String[] args) { int port = Integer.parseInt("6666"); try { Thread t=new ServerSockett(port); t.run(); }catch (IOException e){ e.printStackTrace(); } } @Override public void run() { while (true){ try { System.out.println("等待客户端连接...."); Socket server = serverSocket.accept(); System.out.println("远程主机地址:"+server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("欢迎连接!"+server.getLocalAddress()+"\n"); server.close(); } catch (IOException e) { e.printStackTrace(); break; } } } }