java socket如何传递对象?

java socket如何传递对象?并跟着对象还传递字符串等信息

     Socket soc = new Socket("192.168.3.64", 4567);
     ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
     User user = new User();
     oos.writeObject(user);

socket传递对象,所传递的对象必须实现Serializable。
你还想跟着对象传递字符串的话,可以把这个字符串放到对象中,在对象中多定义一个属性,这个属性就代表那个字符串不就行了么。

网络传输的实质是按传输网络层规定的字符串二进制编码规则(任何语言都识别)来传输字符串,当某个语言的程序(java后台/php/ios/android/前端js等)接收到的网络传输结果的时候就知道传输了什么字符串过来。而序列化,就是事先给传输的内容定义一个(如何将字符串解析为类,将类解析为字符串)的规则,这样子就能在发送时将类作为字符串发送,接收时字符串转为类。所以如果没有序列化,类是无法传输的,因为没有规则,它不知道该如何表达这是一个类,这是一个什么类,这是一个有什么内容的类。

先创建一个xml(config.xml,位与cml.ll.config包下)文件,内容如下:
你可以为每一个不同的请求都设定一个特定的代号,然后通过反射查找no等于你这个传递过来的代号即可,然后找到这个socket元素,使用里面的server线程来处理相关逻辑

    ```
    <?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- 
    实例:
        <socket
            no="需要解析的请求代号" 
            server="处理这个请求的线程服务java完整名称:包名加类名">
        </socket>
-->
```

再创建一个java文件,用于实现反射加载model

        // 1.获取文件
        InputStream inStream = this.getServletContext().getResourceAsStream("./WEB-INF/classes/com/ll/config/config.xml");
        // 使用SAXReader对象
        SAXReader reader = new SAXReader();
        try {
            //读取文件
            Document document = reader.read(inStream);
            //查找no等于请求代号的socket元素
            Element element = (Element) document.selectSingleNode("//socket[@path='" + no + "']");
            String server = element.attributeValue("server");
            //反射()
            Class<?> cls = Class.forName(server);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //监听端口
        @SuppressWarnings("resource")
        ServerSocket ss = new ServerSocket(4567);
        Socket soc = ss.accept();
        //创建输入流和输出流
        ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
        //创建所需要的参数类型集合
        Class<?>[] paramTypes = new Class[] {ObjectOutputStream.class,ObjectInputStream.class,Socket.class};  
    //创建所需要的参数集合
    Object[] params = new Object[] {oos,ois,soc};  
    //通过构造方法创建对象
    Object obj = cls.getConstructor(paramTypes).newInstance(params); 
    //创建线程启动 
        Thread t = new Thread(obj);
        t.start();

写的可能还有缺陷,还望谅解!