1.单例模式
单例:一个类获取多次,只得到一个对象
1 构造方法私有化
2 静态变量存储对象
3 公共的静态方法,用于获取对象
public class Singleton_01 { private Singleton_01() { } // volatile : 防止指令重排 private volatile static Singleton_01 s = null; // public synchronized static Singleton_01 getInstance() { public static Singleton_01 getInstance() { if (s == null) { synchronized (Singleton_01.class) { if (s == null) { s = new Singleton_01(); } } } return s; } }
2.网络编程
Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序。
Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并 且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一 的网络编程环境。
网络编程的目的:
直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
网络编程中有两个主要的问题:
如何准确地定位网络上一台或多台主机;定位主机上的特定的应用,找到主机后如何可靠高效地进行数据传输
3.网络通信
两个要素:IP地址 端口号
IP地址(InetAddress): 唯一的标识 Internet 上的计算机(通信实体)
本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
端口号:标识正在计算机上运行的进程(程序)
不同的进程有不同的端口号
端口分类:
公认端口:0~1023
注册端口:1024~49151
动态/私有端口:49152~65535
端口号与IP地址的组合得出一个网络套接字 :Socket
4.网络协议
传输层协议中有两个非常重要的协议:
传输控制协议TCP(Transmission Control Protocol)
用户数据报协议UDP(User Datagram Protocol)。
TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议, 包括多个具有不同功能且互为关联的协议。
IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
TCP:
有序:顺序不会乱
可靠:面向连接 连接成功后才能发送数据
能重传:不丢失数据,假如丢失了,会记录下来重新发送
需求来回往返,简称三次握手
5.TCP服务端
服务器程序的工作过程包含以下四个基本步骤:
1 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口 上。用于监听客户端的请求。
2 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信 套接字对象。
3 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
4 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
public static void main(String[] args) throws Exception { // 创建对象,绑定IP和端口 Socket skt = new Socket("127.0.0.1", 10001); // 获取服务端传递的信息 // 获取输入流 InputStream is =skt.getInputStream(); // 转换为字符输入 InputStreamReader isr = new InputStreamReader(is,"gbk"); // 转换为字符输入缓冲流 BufferedReader br = new BufferedReader(isr); // 给服务端响应信息 // 获取输出流 OutputStream os = skt.getOutputStream(); PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "gbk")); String temp = null; Scanner scanner = new Scanner(System.in); while (!(temp = scanner.nextLine()).equals("退出")) { pw.println(temp); pw.flush(); System.out.println(br.readLine()); } br.close(); isr.close(); is.close(); skt.close(); }
6.TCP客户端
客户端Socket的工作过程包含以下四个基本的步骤:
1 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
2 打开连接到Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
3 按照一定的协议对Socket 进行读/写 *** 作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
4 关闭 Socket:断开客户端到服务器的连接,释放线路
public static void main(String[] args) throws Exception { // 1 创建对象 开启端口 ServerSocket ss = new ServerSocket(10001); System.out.println("服务器已启动,等待连接..."); // 执行到这里就会进入等待,等待客户端连接 // 返回客户端对象 Socket skt = ss.accept(); System.out.println("客户端已连接"); // 给客户端响应信息 // 获取输出流 OutputStream os = skt.getOutputStream(); PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "gbk")); // 获取输入流 InputStream is = skt.getInputStream(); // 转换为字符输入 InputStreamReader isr = new InputStreamReader(is, "gbk"); // 转换为字符输入缓冲流 BufferedReader br = new BufferedReader(isr); String temp = null; while ((temp = br.readLine()) != null) { // 得到客户端数据 System.out.println("客户端发来消息 : "+temp); // 向客户端发送数据 pw.println("您的反馈 '"+temp+"' 我们已收到,尽快给您答复."); pw.flush(); } // 先开启的,后关闭 pw.close(); os.close(); skt.close(); ss.close(); System.out.println("服务器已关闭"); } public static void test() throws Exception { // 1 创建对象 开启端口 ServerSocket ss = new ServerSocket(10001); System.out.println("服务器已启动,等待连接..."); // 执行到这里就会进入等待,等待客户端连接 // 返回客户端对象 Socket skt = ss.accept(); System.out.println("客户端已连接"); // 给客户端响应信息 // 获取输出流 OutputStream os = skt.getOutputStream(); PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "gbk")); pw.println("你好吗?"); pw.println("吃了吗"); pw.flush(); // 先开启的,后关闭 pw.close(); os.close(); skt.close(); ss.close(); System.out.println("服务器已关闭"); }
7.UDP协议
UDP:速度快,不保证可靠,可能丢包,无连接
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP 地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和 接收方的连接。如同发快递包裹一样。
8.UDP客户端
public static void main(String[] args) throws Exception{ Scanner scanner = new Scanner(System.in); String string = scanner.nextLine(); // 1 字节数组流 --> 数据流写出到字节数组流 --> 字节数组 // 2 字节数组 --> 转换为字节数组流 --> 数据流读取字节数组流中的数据 while (string != null && !string.equalsIgnoreCase("exit")) { // 把数据转换为字节数组流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 转换为数据流,用于数据传递 DataOutputStream dos = new DataOutputStream(bos); // 把字符串写进数据流 dos.writeUTF(string); // 转换为字节数组 byte[] bytes = bos.toByteArray(); // 服务端地址和端口 就是数据包发送到哪里去 InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 10001); // 数据传递,打包 DatagramPacket dp = new DatagramPacket(bytes, bytes.length,inetSocketAddress); // 传输 需要开启客户端端口 DatagramSocket ds = new DatagramSocket(9999); // DatagramPacket : 数据包 // DatagramSocket : 进行数据通信 // 发送 ds.send(dp); ds.close(); System.out.println("请输入传递的信息"); string = scanner.nextLine(); } }
9.UDP服务端
public static void main(String[] args) throws Exception{ // 1 打开UDP对象,并监听端口 DatagramSocket ds = new DatagramSocket(10001); // 保存数据的字节数组 byte[] bytes = new byte[1024]; // 包接收器 DatagramPacket dp = new DatagramPacket(bytes,bytes.length); while (true) { // 通过开启的端口 接收数据 ds.receive(dp); // 转换为字节数组流 ByteArrayInputStream bais = new ByteArrayInputStream(bytes); // 使用数据流读取数据 DataInputStream bis = new DataInputStream(bais); // 读取数据 String data = bis.readUTF(); System.out.println(data); } }
10.区别
TCP协议:
⦁ 使用TCP协议前,须先建立TCP连接,形成传输数据通道
⦁ 传输前,采用“三次握手”方式,点对点通信,是可靠的
⦁ TCP协议进行通信的两个应用进程:客户端、服务端。
⦁ 在连接中可进行大数据量的传输
⦁ 传输完毕,需释放已建立的连接,效率低
UDP协议:
⦁ 将数据、源、目的封装成数据包,不需要建立连接
⦁ 每个数据包的大小限制在64K内
⦁ 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
⦁ 可以广播发送
⦁ 发送数据结束时无需释放资源,开销小,速度快
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)