黑马程序员Java学习笔记之使用UDP通信传输自定义类

来源:互联网 发布:淘宝卖家购物车营销 编辑:程序博客网 时间:2024/05/01 07:16
-------android培训、java培训、期待与您交流! ----------   
这里其实还是流的相关操作,用ObjectInputStream和ObjectOutputStream,先将类进行序列化,转换成字节数组,再传输,传输后再执行反序列化还原成类。

     首先定义一个Student类:
package TestNP;import java.io.Serializable;import java.util.HashMap;import java.util.Map;/** * Created by za on 2015/7/27. */public class TestStudent implements Serializable {    private int id;    private String name;    private int age;    private HashMap<String, Integer> scores;    public TestStudent() {    }    public TestStudent(int id, String name, int age, HashMap<String, Integer> scores) {        this.id = id;        this.name = name;        this.age = age;        this.scores = scores;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public HashMap<String, Integer> getScores() {        return scores;    }    public void setScores(HashMap<String, Integer> scores) {        this.scores = scores;    }    @Override    public String toString() {        return "TestStudent{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                ", scores=" + scores +                '}';    }}

     
     在客户端对该类的一个对象进行序列化,转换成字节数组:
package TestNP;import java.io.*;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;import java.util.HashMap;import java.util.Map;/** * UDP客户端 * 测试传输一个Student类 * 使用序列化和反序列化 IO流 * Created by za on 2015/7/27. */public class MyClient {    public static void main(String[] args) {        try {            //第一步:创建客户端 + 端口(因为在同一台电脑所以端口不要冲突)            DatagramSocket client = new DatagramSocket(6666);            //第二步:准备数据            /*String msg = "测试数据aaaasdifjei";            byte[] data = msg.getBytes();*/            HashMap<String, Integer> scoresA = new HashMap<String, Integer>();            scoresA.put("Java", 95);            scoresA.put("C++", 80);            scoresA.put("Python", 90);            TestStudent ts = new TestStudent(1001, "John", 25, scoresA);            byte[] data = convert(ts);            //第三步:打包并制定发送的地点和端口            DatagramPacket packet =                    new DatagramPacket(data, data.length, new InetSocketAddress("127.0.0.1", 8888));            //第四步:发送数据            client.send(packet);            //第五步:释放资源            client.close();        } catch (SocketException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    public static byte[] convert(TestStudent ts) {        byte[] data = null;        try {            //建立一个临时字节数组            data = null;            //选择序列化用的流            ByteArrayOutputStream bos = new ByteArrayOutputStream();            ObjectOutputStream oos = new ObjectOutputStream(                    new BufferedOutputStream(bos));            oos.writeObject(ts);            oos.flush();            //获取数据            data = bos.toByteArray();            oos.close();            bos.close();        } catch (IOException e) {            e.printStackTrace();        }        //返回byte[]        return data;    }}


     在服务端进行解析,并还原成一个Student类对象:
package TestNP;import java.io.*;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;/** * UDP服务端 * 解析一个int类型数组 * Created by za on 2015/7/27. */public class MyServer {    public static void main(String[] args) {        try {            //第一步,创建服务端 + 端口            DatagramSocket server = new DatagramSocket(8888);            //第二步,准备接收容器            byte[] container = new byte[1024];            //第三步,打包封装            DatagramPacket packet = new DatagramPacket(container, container.length);            //第四步,接收数据            server.receive(packet);            //第五步,分析数据            byte[] data = packet.getData(); //拿到传过来的byte[]数组            TestStudent ts = resolve(data); //调用resolve方法得到返回的对象            System.out.println(ts);            //输出结果,TestStudent{id=1001, name='John', age=25, scores={Java=95, C++=80, Python=90}}            //第六步,释放资源            server.close();        } catch (SocketException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    public static TestStudent resolve(byte[] data) {        //建立一个TestStudent对象用于接受解析好的对象        TestStudent ts = null;        try {            //选择流,此时可以匿名使用ByteArrayInputStream            ObjectInputStream ois = new ObjectInputStream(                    new BufferedInputStream(                            new ByteArrayInputStream(data)));            ts = (TestStudent) ois.readObject(); //读出,强转,赋值给ts            ois.close(); //关闭流        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return ts; //返回ts对象    }}


     其实网络通讯最重要的还是对流的掌握和理解。 
0 0
原创粉丝点击