【问题标题】:Sending vectors over TCP-is it done using the ObjectOutput?通过 TCP 发送向量 - 是否使用 ObjectOutput 完成?
【发布时间】:2013-10-31 02:53:38
【问题描述】:

好的,我正在开发一个程序来保存向量中多个文件的名称和路径,并将它们从服务器发送到客户端。所以我只是尝试发送一个带有单个文件的单个向量,但无济于事。 Client代码中的向量初始化确实有点奇怪,使用ObjectInput和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 已损坏。我错过了什么?

【问题讨论】:

  • 您的代码看起来不错。您是否在客户端和服务器上运行不同版本的 Java?
  • @Alex Nope,实际上是在同一个系统上运行它们,所以我认为这是不可能的。能否请您告诉我如何在客户端代码中声明 Vector 名称的大小和增量?
  • 如果遇到异常,则应编辑问题以包含完整的堆栈跟踪。
  • @Alex 好的,这正是我收到的内容:TCPClient.java:19:incompatible types found :java.lang.Object required:java.util.Vector Vector 名称 = objectInput.readObject(); ^ 1 个错误

标签: java vector


【解决方案1】:

你的问题是这一行:

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

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

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

这将使您摆脱编译错误,但您将遇到更多问题,因为服务器代码写入StringVector。因此,在客户端,您必须先检查从流中读取的对象的类型(使用 instanceof),然后再将其转换为适当的类型。

【讨论】:

  • 谢谢,这是有道理的。但是,如何分配这个向量的默认长度和增量?
  • 你不能。使用 ObjectInputStream 时,反序列化对象的内部字段是根据从流中读取的值设置的,因此它们将与在服务器端写入的值相同。如果你想改变这些,你必须创建一个新的向量并将反序列化向量的内容复制到其中。
  • 好的,现在我已经编辑了该行: 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 已损坏。如果不是太麻烦,你能告诉我我做错了什么吗?
  • 在原始问题中编辑了更简洁的代码版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2018-06-28
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多