Java基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础相关的知识,希望对你有一定的参考价值。
(一)TCP编程
(1)TCP(建立连接通道)编程的客户端的开发步骤
1)创建客户端的Socket对象
Socket:就是客户端的Socket
构造方法
public Socket(InetAddress address, int port)
public Socket(String host, int port):创建客户端套接字对象,并且指定端口号和ip文本形式
2)获取通道内的输出流对象
3)给服务器端写数据
4)释放资源
java.net.ConnectException: Connection refused: connect 连接被拒绝
不要先运行客户端,客户端的连接需要服务器监听到才能连接
5)方法
- public Socket(String host, int port) 创建客户端的Socket对象
- public OutputStream getOutputStream():获取套接字 的输出流
(2)服务端的开发步骤: - 1)创建服务器端的Socket对象
- 2)监听客户端的连接(阻塞方法)
- 3)获取通道内的输入流
- 4)读取数据,显示控制台
- 5)释放资源
- java.net.BindException: Address already in use: JVM_Bind 地址被绑定,因为已经有服务器在监听客户端连接
6)方法 - public ServerSocket(int port) throws IOException创建绑定到特定端口的服务器套接字
监听客户端的连接(阻塞方法)
- public Socket accept(): throws IOException侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞
- InputStream getInputStream() 获取通道内的输入流
- 获取ip文本形式‘ :public InetAddress getInetAddress()
- 服务端不可关闭
例:客户端读取当前项目下的某个文本文件,服务器复制这个文件内容输出一个新的文本文件(Copy.java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端读取当前项目下的某个文本文件,服务器复制这个文件内容输出一个新的文本文件(Copy.java)
/**
- 按照正常的思路,加入了服务器端反馈操作,发现服务器端的反馈数据,客户端并没有收到,客户端也没有结束,再等待服务器发送
- 在客户端这边,如果SendDemo.java如果读完了,服务器端那边并不知道是否读完(流是不能使用null作为信息结束条件的,但是客户端文本文件是可以用null作为信息结束条件的)
- 服务器等待客户端通知文本已经读完了,而客户端还需要服务器端反馈
- 解决方案:
- 1)客户端这边,写一个结束条件,---->服务器如果读取到了这个结束条件的话,服务器就可以反馈
- 第一种方式虽然可以解决这种问题,不好,不灵活!
-
2)public void shutdownOutput():通知服务器端(我没有数据了,你赶紧反馈)
-
*/
public class UploadClient {public static void main(String[] args) throws IOException {
//创建客户端的Socket对象 Socket s = new Socket("192.168.10.1",11111); //当前对象创建之后,就会和服务器端建立连接通道 //封装文本文件 BufferedReader br = new BufferedReader( new FileReader("SendDemo.java")) ; //封装通道内的流 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())) ; //读写操作 String line =null; while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); bw.flush(); } //自定义的结束条件 /*bw.write("over"); bw.newLine(); bw.flush();*/ //通知服务器端,客户端的文件已经完了,赶紧给反馈 //public void shutdownOutput(): s.shutdownOutput(); //获取服务器反馈的数据 //获取通道内的字符输入流 BufferedReader brClient = new BufferedReader( new InputStreamReader(s.getInputStream())) ; String client = brClient.readLine() ; System.out.println(client); //释放资源 br.close(); s.close();
}
}
服务端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
//客户端将文本文件中的数据,复制到服务器端输出的新的java文件中,然后服务器端要给客户端反馈数据,客户端将反馈的数据展示
public class UploadServer {
public static void main(String[] args) throws IOException {
//服务器端的Socket对象
ServerSocket ss = new ServerSocket(11111) ;
//监听
Socket s = ss.accept() ;//阻塞
//封装通道内的流
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream())) ;
//封装最终要输出的文本文件
BufferedWriter bw= new BufferedWriter(new FileWriter("Copy.java")) ;
String line = null ;
while((line=br.readLine())!=null) { //阻塞 //通道内的流结束不是用null作为结束条件的
bw.write(line);
bw.newLine();
bw.flush();
}
//服务端获取通道内的输出流对象
BufferedWriter bwServer = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())) ;
//向客户端反馈
bwServer.write("文件上传成功了");
bwServer.newLine();
bwServer.flush();
//释放资源
bw.close();
s.close();
}
}
(二)反射
(1)什么是反射:
- 反射就是通过获取class字节码文件对象/Class的类对象,
- 获取该字节码文件对象中的成员变量,构造方法,和成员方法
- Field: 简称成员变量 (Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
- 反射的字段可能是一个类(静态)字段或实例字段。)
Constructor:简称构造方法:提供关于类的单个构造方法的信息以及对它的访问权限。
Method:简称成员方法:类或接口上单独某个方法(以及如何访问该方法)的信息
(2)获取字节码文件
参数:类路径:包名.类名
Class c = Class.forName("类路径:包名.类名");
(3)方法 - public Constructor<?>[] getConstructors():Class 对象所表示的类的所有公共构造方法
- public Constructor<?>[] getDeclaredConstructors():获取当前字节码文件对象中的所有的构造方法
- 如何获取单个的构造方法
- public Constructor<T> getConstructor(Class<?>... parameterTypes)
//如果是无参的,不用写;如果是有参的,getContStructor方法中的参数是当前参数类型的静态属性class - 获取当前构造的对象; public T newInstance(Object... initargs):initrgs:实际参数
- 现在获取的那个构造方法是私有的:public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
- public void setAccessible(boolean flag):值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查
异常: java.lang.IllegalAccessException: Class org.westos_02.ReflectDemo3 can not access a member of class org.westos_01.Person with modifiers "private at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) - public Field[] getDeclaredFields():获取当前字节码文件对象中所有的字段
- public Field[] getFields():获取的是公共的字段
- public void set(Object obj,Object value)
参数1:表示给哪个对象设置当前字段的值
参数2:表示给当前获取的哪个Field对象的字段设置一个新的值
java.lang.NoSuchFieldException: name
name是私有的,必须指定方法获取 - public Field getDeclaredField(String name):指定的字段
- 获取当前字节码文件对象中的所有的公共的成员方法(包括父类中的):public Method[] getMethods()
- public Method[] getDeclaredMethods():所有的成员方法
- 获取单个的成员方法,Method
public Method getMethod(String name, Class<?>... parameterTypes)
参数1: 表示方法名
参数2:表示当前方法的参数数据类型的静态class属性 - public Object invoke(Object obj, Object... args)
参数1:指定的哪个对象上调用底层invoke(),
参数2:表示的调用那个方法所传递的实际参数
以上是关于Java基础的主要内容,如果未能解决你的问题,请参考以下文章