2013-10-30 13 views
0

好的,我正在开发一个程序,用于保存向量中多个文件的名称和路径,并将这些文件从服务器发送到客户端。所以我只是试图用一个文件的单个条目发送一个单一的矢量,但无济于事。客户端代码中的向量初始化似乎有点奇怪,使用ObjectInput和ObjectOutput接口发送向量是不正确的?或者我只是做错了吗? Server代码:通过TCP发送矢量 - 是使用ObjectOutput完成的吗?

import java.io.*; 
import java.net.*; 
import java.util.*; 
    class TCPServer 
    { 
    public static void main(String argv[]) throws Exception 
     { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(6789); 
     Vector<String> name = new Vector<String>(3, 1); 
     File f0=new File("C:/Downloads","hjd"); 
     name.addElement(f0.getName()); 


     while(true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = 
       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      if(clientSentence!="hjd") 
      outToClient.writeBytes("Please enter correct directory/filename"); 
      else{ 
      OutputStream socketStream = connectionSocket.getOutputStream();//output stream where the object is to be written 
      ObjectOutput objectOutput = new ObjectOutputStream(socketStream); 
      objectOutput.writeObject(name);//no error during compilation of this line however 



    } 
    } 
} 

而这给了我发现误差向量中的声明行不兼容类型的客户端代码:

import java.io.*; 
import java.net.*; 
import java.util.*; 


class TCPClient 
{ 
public static void main(String argv[]) throws Exception 
{ 
    String sentence; 
    System.out.println("Enter name of file as hjd");//I will later expand this to add more options 
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    sentence = inFromUser.readLine(); 
    outToServer.writeBytes(sentence + '\n'); 
    InputStream socketStream = clientSocket.getInputStream(); 
    ObjectInputStream objectInput = new ObjectInputStream(socketStream); 
    Vector<String> name = objectInput.readObject();//This is the line I am recieving an error on,saying "incompatible types found" 
    System.out.println("The name of file is:"+name.get(0)); 
    clientSocket.close(); 
} 
} 

汇总,我可以给使用这些接口的载体?如果不是,那么我如何通过TCP发送一个向量?如果是的话,错误线路的正确声明是什么,因为这个线路甚至没有提到的矢量的大小或增量?

编辑 - 现在感谢ALex,错误消失了。我已编辑的声明像这样:

if(objectInput.readObject() instanceof String){ 
    String a=(String)objectInput.readObject(); 
    System.out.println("The name of file is:"+a); 
}else if(objectInput.readObject() instanceof Vector){ 
    Vector<String> name=(Vector<String>)objectInput.readObject(); 
    System.out.println("The name of file is:"+name.get(0)); } 

,但会产生话说例外的程序运行,而我的ObjectInputStream已损坏。我错过了什么?

+0

您的代码看起来不错。您是否在客户端和服务器上运行不同版本的Java? – Alex

+0

@Alex Nope,实际上在同一个系统上运行它们,所以我不认为这是可能的。那么你能告诉我如何在客户端代码中声明Vector名称的大小和大小吗? – rednblue

+0

如果您收到异常,则应编辑问题以包含完整的堆栈跟踪。 – Alex

回答

0

你的问题是这样的一行:

Vector<String> name = objectInput.readObject(); 

的问题是,ObjectInputStream.readObject()方法被定义为返回一个Object,所以你不能将它的返回值赋给声明Vector类型的变量。为了使这项工作,你需要明确将返回值:

Vector<String> name = (Vector<String>)objectInput.readObject(); 

这将让你过去的编译错误,但由于服务器代码写入无论是StringVector你有进一步的问题。所以在客户端,您必须检查从流中读取的对象的类型(使用instanceof),然后将其转换为适当的类型。

+0

谢谢,这是有道理的。但是,如何分配此矢量的默认长度和incr? – rednblue

+0

你不能。当使用ObjectInputStream时,反序列化对象的内部字段将根据从流中读取的值进行设置,因此它们将与服务器端写入的值相同。如果你想改变这些,你将不得不创建一个新的Vector,并将反序列化矢量的内容复制到它中。 – Alex

+0

好吧,所以现在我已经编辑该行,如下所示: if(objectInput.readObject()instanceof String){ String a =(String)objectInput.readObject(); System.out。println(“文件名称:”+ a); } else if(objectInput.readObject()instanceof Vector){ Vector name =(Vector )objectInput.readObject(); System.out.println(“文件的名称是:”+ name.get(0)); } 错误消失了!但是,在运行程序时,会产生一个异常,说我的ObjectInputStream已损坏。如果不是太麻烦,你能告诉我我做错了什么吗? – rednblue