java socket如何传递对象?

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

3个回答

先创建一个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();

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

wild84
wild84 谢谢,辛苦你了
3 年多之前 回复
qq_32933131
「已注销」 补充,创建的xml文件位于com.ll.config,这只是个大概的想法
3 年多之前 回复
     Socket soc = new Socket("192.168.3.64", 4567);
     ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
     User user = new User();
     oos.writeObject(user);

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

qq_32933131
「已注销」 回复wild84: 真实项目中,一般都会使用配置文件来单独配置的。然后写好一个反射,你只需要管理配置文件即可。
3 年多之前 回复
qq_32933131
「已注销」 回复wild84: 也可以使用xml文件配置来进行反射操作
3 年多之前 回复
qq_32933131
「已注销」 回复wild84:反射的话,那就可以创建一个properties文件,使用反射来操作,
3 年多之前 回复
wild84
wild84 我的需求是,我的操作数据的类放在server端,我用客户端发送一个信息或者一个对象,及我要对这个对象做什么或者要什么信息。服务器就调用操作数据的类的相关方法,把数据处理好之后回传给我,可以通过对象也通过字符串。但是我发现实现起来很难。多线程的时候我们只写一个run方法,那么如果传递信息过来就变成我们一个switch,匹配之后再做我要求的动作。如我要求的动作很多,这个switch会很长很长。有没有什么好的办法可以解决这个问题?用反射可以吗?如何操作?
3 年多之前 回复
wild84
wild84 你说的是解决了我的问题,不过我想问在真实开发项目中会这么做吗?或者还有没有其他方法?
3 年多之前 回复

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

Vincent_Field
Vincent_Field 回复Vincent_Field: 可能不是JDK自带的,正确名字叫JdkSerializationRedisSerializer
3 年多之前 回复
Vincent_Field
Vincent_Field 回复wild84: 最近做redis时发现,这个问题可以参考spring redis的序列化方式,使用JDKSerializer类名不全,你去搜搜看,就是JDK自带的序列化方式
3 年多之前 回复
wild84
wild84 我知道要序列化的,只是我的想法是,我传输一个对象过去,并且一起传递一个字符串告诉服务器我要对这个对象做什么?服务器处理好之后再传回来这样?
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐