网络编程和反射机制

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");

    }
}

以上是关于网络编程和反射机制的主要内容,如果未能解决你的问题,请参考以下文章

华为大佬讲解JAVA编程不可不知的反射用法总结

网络编程socketserver的方法都有哪些

Java之反射机制

java的反射

Java基础增强-反射机制

Java编程基础-反射