网络编程和反射机制
Posted 筱_skye
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程和反射机制相关的知识,希望对你有一定的参考价值。
java网络编程:
传输协议,网络连接。都是java的虚拟机处理的。
java.net 包下;
1.网络的地址
1.InetAddress : 网络地址;
没有构造方法,通过静态方法getByName(String host) 获取
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
2.程序端口:1~2^16 ,表示计算机中联网程序的网络通道
常用的端口:
浏览器:80
FTP : 21
ORACLE :1521
mysql :3306
Tomcat :8080
自定义程序不要使用1000以下的端口
2.使用哪种协议(TCP/UDP)
TCP :
建立连接,可靠地链接
三次握手
连接上了才会发送消息
UDP :
不需要连接,通过数据包发送
不可靠的链接,速度快
数据包最大是64K.每个数据包都包含一个包头,其中都要目的地的地址和端口。
3.处理传输的内容
使用IO进行传输
网络编程步骤:
客户端
1.创建一个 套接字 对象
Socket socket = null;
2.获取输出流
OutputStream out = null;
try{
socket = new Socket(address,8888); //地址和端口
out.write(“需要发送的消息内容”.getBytes()); //.getBytes()转换为字符型
}catch(){}
3.释放资源
if(out != null){try–out.close();–catch(){}}
if(socket != null){try–socket.close();–catch(){}}
服务器端
1.接收客户端的链接
ServerSocket ss = null;
2.读取客户端给你发的消息
Socket socket = null;
InputStream ins = null;
try{
ss = new SeverSocket(8888); //接收的端口号
while(true){
//对接收到的文件处理
socket = ss.accept();
ins = socket.getInputStream();
byte[] b= new byte[24];
int len = 0;
while((len = ins.read(b))!=-1){
System.out.println(new String(b,0,len));
}
}
}catch{}
3.释放资源:
finally{
if(ins != null){
try{
ins.close();
}catch(){}
}
if(socket != null){
try{
socket.close();
}catch(){}
}
if(ss != null){
try{
ss.close();
}catch(){}
}
}
练习:向服务器发送一张图片
package com.skye2;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import org.junit.Test;
/*
* 2. 服务器接收客户端发的图片
*/
public class SeverAndClient {
//客户端
@Test
public static void client(){
InetAddress address = null;
try {
address = InetAddress.getByName("localhost");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//创建一个套接字对象
Socket socket = null;
//获取输出流
OutputStream out = null;
try {
socket = new Socket(address,8877);
out = socket.getOutputStream();
// out.write("C:/Users/clover/Pictures/1111/二/images.jpg".getBytes());
//1首先定义一个读取文件流
FileInputStream is = new FileInputStream("C:/Users/clover/Pictures/1111/二/images.jpg");
//2读取方式跟下边server的方式一样,复制过来
byte[] b = new byte[1024];//这个数组的长度就是一次读取数据的大小,一般写1024,写小了循环次数会增加
//3每次读取到数据的长度,默认0或-1都行,因为下边即使第一次读不到read方法会返回-1的
int len = -1;
//4循环输出数据,read方法读取不到数据时返回-1
while((len = is.read(b))!= -1){
//5把读取到的数据输出到server
out.write(b, 0, len);
}
//6关闭文件读取流,输出文件写完了,继续相应要读取在server方法
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//服务端
@Test
public static void server(){
ServerSocket image = null;
//链接客户端的链接
Socket socket = null;
//读取客户端发的消息
InputStream ins = null;
try {
image = new ServerSocket(8877);
while(true){
socket = image.accept();
ins = socket.getInputStream();
//读取数据都是读取到的byte数据,不管传输的是文件还是字符串,FileOutPutStream对象写文件到磁盘
//文件输出路径,
FileOutputStream fos = new FileOutputStream("src/com/skye2/photo.jpg");
//读取数据存放的byte数据
byte[] b = new byte[1024];
//读取长度
int len = 0;
while((len = ins.read(b))!= -1){
// System.out.println(new String(b,0,len));
//输出读取到的文件数据到磁盘文件
fos.write(b, 0, len);
}
//关闭输出流
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if(ins != null){
try {
ins.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(image != null){
try {
image.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//首先调用server
server();//不是static的方法,改一下
}
}
package com.skye2;
public class ClientTest {
public static void main(String[] args) {
//首先调用server
SeverAndClient.client();//先运行 server方法的类
}
}
使用UDP进行网络编程
DatagramSocket --- UDP的网络传输
Java反射机制
如何实现反射:
Java.lang.Class
获得类对象
1. 直接通过类名的属性获取
2. 通过完整类名的字符串获取(包名.类名的方式),调用class 的静态方法forName(className)获得
Class stucla = Class.forName(“com.skye.after.Student”);
练习:
package com.skye;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
/*
* 设计一个USB接口,电脑带一个USB接口,运行的时候,通过输入看不同USB接口的调用
*
* 2个USB接口的实现
* 1.u盘
* 2.USB电扇
*
* 效果:
* 电脑开始运行,请插入USB设备:
* com.xxx.xUdianshan
* 创建指定对象
* 调用指定方法
* 访问指定属性
*/
public class USBDevice {
public static void main(String[] args) {
System.out.println("电脑开始运行,请插入USB设备!");
// scanner选择插入的是U盘还是USB电扇
//usb
try {
Class<?> usb = Class.forName("com.skye.Upan");
// 通过class 类来创建指定类的对象
Object dev1 = usb.newInstance();
// Field field = usb.getField("name");
//
// System.out.println(field.get(dev1));
Method method1 = usb.getMethod("setName",new Class[] {String.class});
method1.invoke(dev1, new Object[] {"U盘"});
Method method2 = usb.getMethod("setPrice",new Class[] {Integer.TYPE});
method2.invoke(dev1, new Object[] {36});
// 根据属性名获取属性
Method method3 = usb.getMethod("attribute",new Class[] {String.class,Integer.TYPE});
method3.invoke(dev1, new Object[] {"u盘",36});
//
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//电扇的
try {
Class<?> usb = Class.forName("com.skye.USBfan");
Object dev2 = usb.newInstance();
Method method1 = usb.getMethod("setName",new Class[] {String.class});
method1.invoke(dev2, new Object[] {"迷你USB电扇"});
Method method2 = usb.getMethod("setPrice",new Class[] {Integer.TYPE});
method2.invoke(dev2, new Object[] {25});
Method method3 = usb.getMethod("charging",new Class[] {String.class,Integer.TYPE});
method3.invoke(dev2, new Object[] {"迷你USB电扇",25});
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.skye;
public class Upan {
private String name;
public int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Upan() {
super();
// TODO Auto-generated constructor stub
}
public Upan(String name) {
super();
this.name = name;
}
// //读的方法
// public void read(){
// System.out.println(this.name+"u盘可以读数据!");
// }
// //写的方法
// public void write(){
// System.out.println(this.name+"u盘里面可以写入数据!");
// }
//u盘的属性
public void attribute(String name,int age){
System.out.println("U盘的属性参数如下:");
System.out.println("\t 名称:"+this.getName());
System.out.println("\t 价格:"+this.getPrice()+"元");
System.out.println("\t 类型: U盘");
System.out.println("\t 文件系统: FAT 32");
System.out.println("\t 已用空间: 5.35GB");
System.out.println("\t 可用空间: 1.44GB");
System.out.println("\t总容量: 6.8GB");
}
}
package com.skye;
public class USBfan {
//USB电扇的名字
public String name;
public int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public USBfan(String name, int price) {
super();
this.name = name;
this.price = price;
}
public USBfan() {
super();
}
//充电的方法
public void charging(String name,int price){
System.out.println(this.name+"的功能有:");
System.out.println("\t 名称:"+this.getName());
System.out.println("\t 类型:可充电"+this.name);
System.out.println("\t 建议售价: "+this.price+"元");
System.out.println("\t 最大功率: 64W");
System.out.println("\t 最小功率: 12W");
}
}
以上是关于网络编程和反射机制的主要内容,如果未能解决你的问题,请参考以下文章