如何在Java中读取套接字服务器上通过objectOutputStream发送的对象

如何在Java中读取套接字服务器上通过objectOutputStream发送的对象,java,objectinputstream,objectoutputstream,Java,Objectinputstream,Objectoutputstream,我有发送工作,但服务器端不会接收数据输入流中发送的对象。该类被序列化并在发送时工作,但我不确定服务器为什么没有接收到它 这是我的密码: Server.ois = new ObjectInputStream(client.getInputStream()); while(Server.ois.available() != 0) { try { TriangleSend ts = (TriangleSend)Server.ois.readObject(); s

我有发送工作,但服务器端不会接收数据输入流中发送的对象。该类被序列化并在发送时工作,但我不确定服务器为什么没有接收到它

这是我的密码:

Server.ois = new ObjectInputStream(client.getInputStream());
while(Server.ois.available() != 0) {
    try {
        TriangleSend ts = (TriangleSend)Server.ois.readObject();
        send(ts);
        Server.ois.close();
    } catch (Exception e) {
        continue;
    }
}
这一切都在
while
循环和
try
中。它还将在收到时生成异常

发送(
TriangleSend
)方法是:

public static void send(TriangleSend coords) {
    for (Socket client : Server.clients) {
        try {
            if (client != null) {
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
                    oos.writeObject(coords);
                    oos.flush();
                } catch (Exception e) {}
            }
        } catch (NullPointerException e) {
            continue;
        }
    }
}
编辑: 源代码和异常:

例外情况如下:

java.io.StreamCorruptedException: invalid stream header: 73720027
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at com.gopro2027.lwjgl.server.ServerThread$1$1.run(ServerThread.java:88)
    at java.lang.Thread.run(Thread.java:745)
Could not send data Timeout: 0
java.io.StreamCorruptedException:无效的流头:73720027
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
位于java.io.ObjectInputStream。(ObjectInputStream.java:299)
位于com.gopro2027.lwjgl.server.ServerThread$1$1.run(ServerThread.java:88)
运行(Thread.java:745)
无法发送数据超时:0

Tyler-在构造ObjectOutputStream之前,用BufferedOutputStream包装客户端的输出流-相反,在服务器端构造ObjectInputStream之前,先执行BufferedInputStream。这将有助于读/写过程

服务器端:

Server.ois = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
while(Server.ois.available() != 0) {
    try {
        TriangleSend ts = (TriangleSend)Server.ois.readObject();
        send(ts);
        Server.ois.close();
    } catch (Exception e) {
        e.printStackTrace();
        continue;
    }
}
发送三角形:

public static void send(TriangleSend coords) {
    for (Socket client : Server.clients) {
        if (client != null) {
            try {
                ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));
                oos.writeObject(coords);
                oos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
删除编辑

while(Server.ois.available() != 0) {

available()
不是流结束的有效测试。请参阅Javadoc。您应该将循环更改为
while(true)
,并在捕获
EOFEException

时中断“它在收到异常时也会生成异常”,只要抛出异常,请发布该异常的堆栈跟踪解决了iti的ANKS ejp将输入和输出流更改为BufferedOutputStream bis=new BufferedOutputStream(client.getOutputStream());ObjectOutputStream oos=新的ObjectOutputStream(bis);它改变了生成错误的次数,但没有修复。你能发布堆栈跟踪吗?你正在吞咽异常。。。我将重新发布代码以实现这一点out@TylerSonger“不起作用”不是一个问题描述。你还没有问一个可以回答的问题。按照每个人的要求发布堆栈跟踪。这应该一直是你的问题。@TylerSonger使用我提供的上述代码,你应该可以看到到处都是堆栈跟踪。一、 以及另外两个,已经要求您发布代码的输出。对不起,我忘了提。我把它放在一个while循环中,然后放在一个新的线程中。我已经在那里了:(如果你需要我,我可以在pastebin上发布完整的代码。我们需要的是神秘的例外,以及你的真实代码。