簡體   English   中英

寫入/讀取對象(Java中的套接字)

[英]Writing/Reading an object(socket in java)

我的問題是我有一個對象類(數據包),其中包含另一個對象(msg)。 我使兩個類都實現Serializable 但是,當我運行程序時,我在代碼的某些部分看到此錯誤“ 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
    }

}

這段代碼有幾個怪異之處。

  1. getPacket() p != null的測試完全沒有意義。

  2. 后來的測試將p == null等同於關閉的連接是不正確的。 在這種情況下,您將得到一個EOFException,而不是null。

  3. Socket.isClosed()只告訴是否已經關閉了套接字。

當您使用單個ObjectInputStream進行讀取並使用多個ObjectOutputStreams進行寫入時,通常會出現“無效類型代碼”,反之亦然。 兩端的使用壽命中請使用其中一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM