socket网络通信 protobuffer序列化

什么是socket网络通信

参考:https://blog.csdn.net/u014209205/article/details/80461122

TCP/UDP

进行Socket编程, 常见使用的协议UDP/TCP
TCP:传输控制协议 。是专门设计用于在不可靠的因特网上提供可靠的,端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
UDP:用户数据报协议 。不需要建立连接,不可靠。

在这里插入图片描述
在这里插入图片描述

消息数据类型
  • Json交换格式, 目前比较理想的一种通信格式, 也是在Http请求数据时, 最常见的用法(Demo程序)
  • ProtocolBuffer(也称PB/GPB): google 的一种数据交换的格式, 可以实现跨平台, 方便的序列化&反序列化, 并且数据量相对json

ProtocolBuffer
1、简介

  • 跨平台
    ProtoBuf支持多平台和语言, 包括C++/Java/Python等等
    序列化&反序列号
  • ProtoBuf支持直接将对象序列化成Data, 也支持直接将Data序列化为对象类型
    消息大小
  • 一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一
    2、安装Protobuf编译器

参照:https://www.jianshu.com/p/cae40f8faf1e

传输的是一句话时候

ServerThread.java

package demo2;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

import java.io.*;
import java.net.Socket;
import java.util.Arrays;

public class ServerThread extends Thread {


    private Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
            is = socket.getInputStream();//字节输入流 读入
            isr = new InputStreamReader(is);//转为字符流
            br = new BufferedReader(isr);//放入缓存等待读取

            String info = null;

            while((info=br.readLine())!=null){
                System.out.println("我是服务器,客户端说:"+info);
            }
            socket.shutdownInput();

            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("服务器欢迎你");

            pw.flush();
        } catch (Exception e) {
            // TODO: handle exception
        } finally{
            //关闭资源
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    }




SocketClient.java

package demo2;

import com.alibaba.fastjson.JSON;

import java.io.*;
import java.net.Socket;
import java.util.Arrays;

public class SocketClient {



    public static void main(String[] args) throws InterruptedException {
        try {
            // 和服务器创建连接
            Socket socket = new Socket("localhost",8099);
            Person person = new Person();
            person.setAge(18);
            person.setHeight(19);
            person.setId(1);
            String str = JSON.toJSONString(person);
            byte[] bytes = str.getBytes();

            // 要发送给服务器的信息
            OutputStream os = socket.getOutputStream();
            os.write(bytes);//写出到服务器

            PrintWriter pw = new PrintWriter(os);
            pw.write("客户端发送信息");
            pw.flush();

            socket.shutdownOutput();

            // 从服务器接收的信息
            InputStream is = socket.getInputStream();
//            BufferedReader br = new BufferedReader(new InputStreamReader(is));
//            String info = null;
//            while((info = br.readLine())!=null){
//                System.out.println("我是客户端,服务器返回信息:"+info);
//            }
            byte[] bytes1 = new byte[1024];

            int read = is.read(bytes1);
            byte[] bytes2 = Arrays.copyOfRange(bytes1, 0, read);
            String s = new String(bytes2);
            System.out.println(s);

            // br.close();
            is.close();
            os.close();
            pw.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    }


SocketServer.java

package demo2;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) {
        try {
            // 创建服务端socket
            ServerSocket serverSocket = new ServerSocket(8088);

            // 创建客户端socket
            Socket socket = new Socket();

            //循环监听等待客户端的连接
            while(true){
                // 监听客户端
                socket = serverSocket.accept();

                ServerThread thread = new ServerThread(socket);
                thread.start();

                InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }


}

传输是一个对象的时候(以json格式传输)

Person.java

package demo3;

public class Person {
    int id;
    int height;
    int age;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", height=" + height +
                ", age=" + age +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

ServerThread.java

package demo3;

import java.io.*;
import java.net.Socket;
import java.util.Arrays;

public class ServerThread extends Thread {


    private Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream is=null;
//        InputStreamReader isr=null;
//        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        byte[] bytes2=null;
        String s1=null;
        try {

            is = socket.getInputStream();
//            isr = new InputStreamReader(is);
//            br = new BufferedReader(isr);
            byte[] bytes = new byte[1024];
            int read = is.read(bytes);

            if (read > 0) {

                bytes2 = Arrays.copyOfRange(bytes, 0, read);
                s1 = new String(bytes2);//byte转字符串
            }

                System.out.println("我是服务器,客户端说:"+s1);

            socket.shutdownInput();

            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("服务器欢迎你");

            pw.flush();
        } catch (Exception e) {
            // TODO: handle exception
        } finally{
            //关闭资源
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
//                if(br!=null)
//                    br.close();
//                if(isr!=null)
//                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    }




SocketClient.java

package demo3;

import com.alibaba.fastjson.JSON;

import java.io.*;
import java.net.Socket;

public class SocketClient {
    public static void main(String[] args) throws InterruptedException {
        try {
            // 和服务器创建连接
            Socket socket = new Socket("localhost", 8084);

            // 要发送给服务器的信息
            OutputStream os = socket.getOutputStream();

            // ####使用的对象转json,json字符串,转bytes数组方式,传输字节流
            Person person = new Person();//创建一个对象
            person.setAge(10);
            person.setHeight(100);

            String s = JSON.toJSONString(person); //对象转json字符串
            byte[] bytes = s.getBytes(); //字符串转bytes数组
            os.write(bytes); //socket写出到服务器
            PrintWriter pw = new PrintWriter(os);
            pw.write("客户端发送信息");
            pw.flush();
            os.flush();
            socket.shutdownOutput();

            // 从服务器接收的信息
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info = null;
            while ((info = br.readLine()) != null) {
                System.out.println("我是客户端,服务器返回信息:" + info);
            }

            br.close();
            is.close();
            os.close();
            pw.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}



SocketServer.java

package demo3;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) {
        try {
            // 创建服务端socket
            ServerSocket serverSocket = new ServerSocket(8084);

            // 创建客户端socket
            Socket socket = new Socket();

            //循环监听等待客户端的连接
            while(true){
                // 监听客户端
                socket = serverSocket.accept();

                ServerThread thread = new ServerThread(socket);
                thread.start();

                InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }


}

使用protobuffer序列化后传输

Person.proto

syntax = "proto3";
option java_package = "demo";//生成类的包名
option  java_outer_classname = "PersonTest";//生成类的类名

message person{
  repeated int32 id     = 1;
  string         name   = 2;
  int32          height = 3;
  string         email  = 4;
}

ServerThread.java

import demo.PersonTest;

import java.io.*;
import java.net.Socket;
import java.util.Arrays;

public class ServerThread extends Thread {


    private Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        OutputStream os = null;
        PrintWriter pw = null;
        String s1 = null;
        byte[] bytes2 = null;
        try {
            is = socket.getInputStream();

//
//            isr = new InputStreamReader(is);//字节转字符
//
//            br = new BufferedReader(isr);//存进缓存
            byte[] bytes = new byte[1024];
            int read = is.read(bytes);
//
//

            if (read > 0) {

                bytes2 = Arrays.copyOfRange(bytes, 0, read);
                s1 = new String(bytes2);//byte转字符串
            }
//           String info = null;



//            System.out.println("我是服务器,客户端说:"+s1);
//            Person person = JSON.parseObject(s1, new TypeReference<Person>() {
//            });

            PersonTest.person person = PersonTest.person.parseFrom(bytes2); //protobuf转成对象
            System.out.println("person的名字" + s1);
            System.out.println("我是服务器,客户端说:" + person.getName());
            System.out.println("我是服务器,客户端说:" + person);
            System.out.println(String.format("反序列化得到的信息,姓名:%s", person.getName()));


            // socket.shutdownInput();//单向关闭输出流。并不会影响socket  如果是os.close()会影响socket。使得socket也会关闭
            //向客户端发送信息
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("服务器欢迎你");

            pw.flush();
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            //关闭资源
            try {
                if (pw != null)
                    pw.close();
                if (os != null)
                    os.close();
//                if(br!=null)
//                    br.close();
//                if(isr!=null)
//                    isr.close();
                if (is != null)
                    is.close();
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

SocketClient.java

import demo.PersonTest;

import java.io.*;
import java.net.Socket;

public class SocketClient {

    public static void main(String[] args) throws InterruptedException {
        try {
            // 和服务器创建连接
            Socket socket = new Socket("localhost", 8083);

            // 要发送给服务器的信息
            OutputStream os = socket.getOutputStream();//得到一个输出流对象

            ####使用的对象转json,json字符串,转bytes数组方式,传输字节流
//          Person person = new Person();//创建一个对象
//         person.setAge(10);
//         person.setHeight(100);
//
//           String s = JSON.toJSONString(person); //对象转json字符串
//          byte[] bytes = s.getBytes(); //字符串转bytes数组
//         os.write(bytes); //socket写出到服务器


//#####使用Protobuf序列化,转成字节通过字节流发给服务器端
            PersonTest.person.Builder personBuilder = PersonTest.person.newBuilder();
            personBuilder.setName("张山");
            PersonTest.person personTest = personBuilder.build();//创建的Person对象
            byte[] bytes = personTest.toByteArray();
            os.write(bytes);

            PrintWriter pw = new PrintWriter(os);//字符类型打印输出流
            pw.write("客户端发送信息");
            pw.flush();

            os.flush();
            socket.shutdownOutput();

            // 从服务器接收的信息
            InputStream is = socket.getInputStream();//返回的是字节输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));//InputStreamRead将字节流转换为单个字符  //tcp以字节流的方式进行传输的//bufferedRead把它存在缓冲区里面
            String info = null;
            while ((info = br.readLine()) != null) {
                System.out.println("我是客户端,服务器返回信息:" + info);
            }

            br.close();
            is.close();
            os.close();
            pw.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

SocketServer.java

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

    public static void main(String[] args) {
        try {
            // 创建服务端socket
            ServerSocket serverSocket = new ServerSocket(8083);

            // 创建客户端socket
            Socket socket = new Socket();

            //循环监听等待客户端的连接
            while(true){
                // 监听客户端
                socket = serverSocket.accept();

                ServerThread thread = new ServerThread(socket);
                thread.start();

                InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值