【问题标题】:Writing/Reading an object(socket in java)写/读一个对象(java中的socket)
【发布时间】:2011-10-18 14:07:55
【问题描述】:

我的问题是我有一个对象类(数据包),其中包含另一个对象(msg)。我让两个类都实现了可序列化。但是当我运行我的程序时,我在代码的某些部分看到了这个错误“java.io.StreamCorruptedException:无效类型代码:00”:

outStrm=new ObjectOutputStream(mySocket.getOutputStream());
inStrm=new ObjectInputStream(mySocket.getInputStream());
outStrm.writeObject(new packet());
outStrm.flush();

在服务器端我是这样读的

Socket client = listen_socket.accept();
in=new ObjectInputStream(client.getInputStream());
out=new ObjectOutputStream(client.getOutputStream());
p=(packet) in.readObject();

我发送了很多数据包,奇怪的是,当我调试它时(一步一步)我不会看到错误,但是当我运行它时,我有这个错误!请帮我。

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

class ServerThre
    extends Thread
{
    Socket client;
    ObjectInputStream in;
    ObjectOutputStream out;

    public ServerThre(Socket client_socket)
    {
        client = client_socket;
        try
        {
            in = new ObjectInputStream(client.getInputStream());
            out = new ObjectOutputStream(client.getOutputStream());
        }
        catch (IOException e)
        {
            try
            {
                client.close();
            }
            catch (IOException e2)
            {
            }
            System.err.println("Exception while getting input streams: " + e);
            return;
        }
        this.start();
    }

    private packet getPacket() throws IOException
    {
        packet p;
        try
        {
            p = (packet)in.readObject();
            if (p != null)
            {
                return p;
            }
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void run()
    {
        while (!client.isClosed())
        {

            packet p = null;
            try
            {
                p = getPacket();
            }
            catch (IOException e1)
            {
                e1.printStackTrace();
            }

            if (p == null)
            {
                System.out.print("Connection closed by server, exiting");
                return;
            }

        }// end of while
    }

}

【问题讨论】:

  • 您需要发布您的代码和堆栈跟踪。问题在于您没有显示的代码,而不是您发布的 8 行代码。
  • 我让我的两个类都实现了可序列化是真的吗?我的总代码很多。
  • 让我们试试这个 - 阅读这个:SSCCE。创建一个演示您遇到的问题的文件。回来,发一下。没有人可以帮助你。您发布的代码段没有任何问题。

标签: java sockets object


【解决方案1】:

这段代码有几个奇怪的地方。

  1. getPacket() 中对p != null 的测试完全没有意义。

  2. 后面将p == null 等同于关闭连接的测试不正确。在这种情况下,你会得到一个 EOFException,而不是 null。

  3. Socket.isClosed() 只告诉你是否已经关闭了套接字。

当您使用单个 ObjectInputStream 进行读取并使用多个 ObjectOutputStream 进行写入时,通常会出现“无效类型代码”,反之亦然。在两端的插座的使用寿命内各使用一个。

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多