2019-03-06——Java学习笔记
文章目录
一、网络编程
1.前提
拥有一个服务端:JDK提供了服务端提供的接口ServerSocket
拥有一个客户端:客户端就是向服务端发送请求,使用Socket这个对象来进行通信
2.两种方式
2.1 TCP
是一个安全的协议,理解为打电话,能不能和对象通信需要对象给出应答。
2.2 UDP
广播协议,不安全只管发送,对方是否能够接受不关心,比如电视
3.实现一个简易聊天(以TCP为例)
3.1 客户端实现
分析
构建一个socket对象,用于用户访问和传输数据
socket = new Socket("localhost", 9999)
向服务器写数据,写到Socket对象中
OutputStream out = socket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(text);
writer.newLine();
writer.flush();
等待服务器响应,会返回数据
InputStrea in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
System.out.println(reader.readLine());
最后别忘了关闭流,看具体实现
实现
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;
BufferedWriter writer = null;
OutputStream out = null;
InputStream in = null;
BufferedReader reader = null;
Scanner sc = new Scanner(System.in);
try {
while (true){
String text = sc.nextLine();
socket = new Socket("localhost", 9999);//构建了一个socket对象用户访问和传输数据
out = socket.getOutputStream();
writer = new BufferedWriter(new OutputStreamWriter(out));
//向服务器写数据,写道Socket对象中
writer.write(text);
writer.newLine();
writer.flush();
/*-----------------------------------*/
//等待服务器响应,会返回数据
in = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
System.out.println(reader.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
writer.close();
out.close();
reader.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.2 服务端实现
分析
服务端需要创建一个ServerSocket服务对象service
ServerSocket service = new ServerSocket(9999);//创建Socket服务对象
调用service对象的accept方法,该方法监听访问的程序,监听端口号为9999,返回一个Socket类型的数据
通过Socket类的getPort方法可以获取访问实例的端口号,用法:
String port = socket.getPort();//socket为Socket的一个对象
通过下列方法可以读取客户端向服务端发来的数据
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
通过下列方法可以往客户端发数据
OutputStream out = socket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(text);//text为需要发送的字符串
writer.newLine();
writer.flush();
最后需要将流关闭,具体见下方实例
实现
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Service {
public static void main(String[] args) {
ServerSocket service = null;
OutputStream out = null;
BufferedWriter writer = null;
Socket socket = null;
InputStream in = null;
BufferedReader reader = null;
Scanner sc = new Scanner(System.in);
try {
service = new ServerSocket(9999);//创建了Socket服务对象
while (true){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("service is init....");
//Socket对象是客户端和服务器端之间通信的对象,由Socket携带数据进行传输
socket = service.accept();//一旦程序运行后次方法将会阻塞,监听访问的程序,监听端口号 9999
System.out.println("service accept:" + socket.getPort());
in = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
System.out.println(reader.readLine());
//谁可以帮助我将返回的数据传输出去=>Socket
String text = "陆嘉能" + df.format(new Date())+ ":"+sc.nextLine();
out = socket.getOutputStream();
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(text);
writer.newLine();
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//从里往关 安全
reader.close();
in.close();
writer.close();
out.close();
socket.close();
service.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
二、单例模式
1. 定义
确保对象的唯一性,比如说买火车票,票源只有一个,购票方式可以有多个
2. 分类
饿汉式
private static Ticket ticket = new Ticket();
public static Ticket getInstance() {
return ticket;
}
懒汉式
public synchronized static Ticket getInstance() {//synchronized 加锁
if(ticket == null) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket = new Ticket();
}
return ticket;
}
3. 如何确保对象唯一
将构造方法私有化
提供公共的静态的接口来获取该类型的对象
在接口中返回对象的实例
三、反射
1 .概念
反射是一种技术,可以通过反射的技术创建对象,获取类中的属性和方法,并调用
2. 流程
2.1 反射获取类
方法一
Class.forName("类的全路径 = 包路径 + 类名");
方法二
类名.class
方法三
对象名.getClass()
2.2 获取类的属性
Class c = Class.forName("类的全路径");
//获取类名
String name = c.getName();
2.3 获取类的一个对象
Object o = c.newInstance();
相当于
类名 对象名 = new 类名();
2.4 调用类的方法
Method md = c.getMethod("方法名",返回值类型.class);
md.invoke(o,方法所需参数);
3.具体实例
User类
import java.io.Serializable;
public class User implements Serializable {//实现序列化接口:保存着继承关系、类型等信息
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void show() {
System.out.println("哈哈哈" + this.getName());
}
}
反射方式使用User类
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 演示反射
*/
public class ReflectDemo {
public static void main(String[] args) {
try {
Class c = Class.forName("com.alisa.day0306.User");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
Object o = c.newInstance();//相当于User user = new User()
System.out.println(o);
Method set_name_method = c.getMethod("setName", String.class);
set_name_method.invoke(o,"张三");//相当于user.setName("张三")
Method set_age_method = c.getMethod("setAge", Integer.class);
set_age_method.invoke(o,20);
Method show = c.getMethod("show");
Object result_show = show.invoke(o);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}