0

我正在開展一個學校項目,下面的代碼是爲構建項目提供的示例(應該沒有任何問題但不能......)。有沒有編譯錯誤,但是當我使用telnet來測試它下面的消息顯示:ObjectInputStream和getInputStream

java.io.StreamCorruptedException: invalid stream header: 56543130 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) 
    at ThreadedDataObjectHandler.run(ThreadedDataObjectServer.java:41) 

41號線是

ObjectInputStream in =new ObjectInputStream(incoming.getInputStream()); 

這裏是我的代碼:

import java.io.*; 
import java.net.*; 
import java.util.*; 
public class ThreadedDataObjectServer { 
    public static void main(String[] args) { 

     try 
    { ServerSocket s = new ServerSocket(3000); 

    for (;;) 
    { Socket incoming = s.accept(); 
     new ThreadedDataObjectHandler(incoming).start(); 

    } 
    } 
    catch (Exception e) 
    { e.printStackTrace(); 
     } 
    } 
} 

class ThreadedDataObjectHandler extends Thread 
{ 
DataObject myObject = null; 
private Socket incoming; 
private String greeting="Hello!"; 
public ThreadedDataObjectHandler(Socket incoming) 
    { 
     this.incoming = incoming; 
    } 

    public void run() 
    { try 
     {  

    ObjectInputStream in =new ObjectInputStream(incoming.getInputStream()); 

    ObjectOutputStream out =new ObjectOutputStream(incoming.getOutputStream()); 

    myObject = (DataObject)in.readObject(); 

    System.out.println("Message read: " + myObject.getMessage()); 

    myObject.setMessage("Got it!"); 

    System.out.println("Message written: " + myObject.getMessage()); 


    out.writeObject(myObject); 

    in.close(); 

    out.close(); 

    incoming.close();  

    } 
    catch (Exception e) 
    { e.printStackTrace(); 
    } 
    } 
} 
class DataObject implements Serializable{ 
    protected String message; 
    public DataObject(){ 
     message=""; 
    } 
public void setMessage(String m){ 
    message=m; 
} 
    public String getMessage(){ 
    return message; 
    } 
} 

我想什麼是要切換語句ObjectInputStream in=...ObjectOutputStream out=...的順序,但沒有運氣。請幫助...謝謝。

+0

你在這段代碼中做了什麼?不,你想做什麼? – Ankit 2013-04-10 04:39:52

+0

您確定客戶端正在使用ObjectOutputStream編寫對象嗎? – 2013-04-10 04:43:27

+0

您需要執行序列化。 – Hemanth 2013-04-10 04:51:24

回答

1

從我所理解的評論中,您嘗試使用ObjectInputStream從telnet連接中讀取對象。

你不能那樣做。如果您要使用ObjectInputStream,則需要使用ObjectOutputStream編寫其他連接程序。

你的telnet客戶端並沒有真正給出Java ObjectOutputStream,ObjectInputStream和Serialization的狗屎。

所以我想嘗試一個像BufferedReader中包裝的InputStreamReader。

如果您只是想測試連通性,只需編寫一個小型java程序,它將連接到您的程序而不是使用telnet。

0

大衛正如我在評論中提到的,您必須編寫一個客戶端,它使用ObjectOutputStream將相同的DataObject發送到服務器套接字。

由於您期望DataObject客戶端需要發送DataObject。當你使用telnet時,它會連接,但是從那裏你不能以Java Object Object能理解的方式發送DataObject。

有關服務器/客戶端示例,請參閱http://zerioh.tripod.com/ressources/sockets.html

另外,因爲它的一些學校運動試圖理解的概念,不要只是複製。