有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过socket发送可序列化对象

我有一个奇怪的问题,就是发送一个通过socket创建的可序列化对象。事实上,如果我在同一台机器上运行服务器和客户机,它工作得很好,但是如果服务器和客户机在不同的机器上,服务器端的readen对象是空的(大小等于零)

有人有办法解决这个问题吗?(代码如下)

服务器:

public static void main () {
...
InputStream is = mysocket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);

ArrayList<MyObject> list_of_object;
list_of_object = (ArrayList<MyObject>) ois.readObject();
logger.log(Level.INFO,"object readen with size : "+list_of_object.size());
...
}

客户:

public static void main () {
...
ObjectOutputStream oos = new ObjectOutputStream(mysocket.getOutputStream());
oos.writeObject(list_of_object);
...
}

共 (1) 个答案

  1. # 1 楼答案

    使用MyObject-class的版本尝试以下测试用例。这将帮助你解决问题。如果这在你的课堂上效果很好,那么可能是网络层,例如,你正在阅读与你期望阅读的内容不同的内容。常见的错误可能是,您正在某处运行旧版本的服务器代码,而您可能确实读取了一个空的MyObject列表

    import static org.junit.Assert.assertEquals;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.ArrayList;
    
    import org.junit.Test;
    
    public class StreamTest {
    
    public static class MyObject implements Serializable {
    
    }
    
    @Test
    public void test() throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        ArrayList<MyObject> list_of_object = new ArrayList<MyObject>();
        list_of_object.add(new MyObject());
        oos.writeObject(list_of_object);
    
        byte[] whatGoesOverWire = baos.toByteArray();
        ByteArrayInputStream bais = new ByteArrayInputStream(whatGoesOverWire);
        ObjectInputStream ois = new ObjectInputStream(bais);
        ArrayList<MyObject> deserialized = (ArrayList<MyObject>) ois
                .readObject();
        assertEquals(1, list_of_object.size());
        assertEquals(1, deserialized.size());
    }
    
    }