java - Java中如何接收多个 vector ?

标签 java networking vector

我是java新手,我在客户端-服务器通信方面遇到问题,我不知道如何读取我发送的多个 vector 。我将感谢您的帮助:)。我的代码是: 服务器:

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

   public class FileServer {
   private static ObjectOutputStream outStream;

   public static void main (String [] args ) throws IOException {

    // create socket
      ServerSocket servsock = new ServerSocket(2926);
   while (true) {
  System.out.println("Waiting...");


  Socket sock = servsock.accept();
  System.out.println("Accepted connection : " + sock);
  outStream = new ObjectOutputStream(sock.getOutputStream());
  // sendfile
  File myFile = new File ("D://music.mp3");


  Vector<Integer> send = new Vector<Integer>(); 
  int CRC=0;
  int part=0;
      for(int num=1;num<=(int) myFile.length()/60;num++){
          CRC= (part+num)%3;
          part = num*60;
          send.addElement(num);          
          send.addElement(part);
          send.addElement(CRC);
          outStream.writeObject(send);
          System.out.println(send);
          send.removeElement(num);
          send.removeElement(part);
          send.removeElement(CRC);

          if((myFile.length()<=(num+1)*60)&&(myFile.length()%60!=0)){
              int left = (int) (myFile.length()%60+part);
              int Num=num+1;
              CRC = (left + num)%2;

              send.addElement(Num);
              send.addElement(left);                 
              send.addElement(CRC);
              outStream.writeObject(send);
              System.out.println(send);
              send.removeElement(Num);
              send.removeElement(part);
              send.removeElement(CRC);



  System.out.println("Sending...");

          }
    }
  outStream.close();

  sock.close();

}
}
}

服务器端错误:

[1 60 1]
....
[64367, 3862020, 2]
[64368, 3862047, 0]
Sending...
Exception in thread "main" java.net.SocketException: Socket closed
  at java.net.SocketOutputStream.socketWrite(Unknown Source)
  at java.net.SocketOutputStream.write(Unknown Source)
  at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
  at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
  at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
  at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
  at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
  at java.io.ObjectOutputStream.writeObject0(Unknown Source)
  at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
  at java.io.ObjectOutputStream.writeObject(Unknown Source)
  at FileServer.main(FileServer.java:61)

我的客户端:

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

public class FileClient{

private static InetAddress host; 
public static void main (String [] args ) throws ClassNotFoundException,    UnknownHostException, IOException {

  host = InetAddress.getLocalHost();
  Socket sock = new Socket(host,2926);
  System.out.println("Connecting...");
  ObjectInputStream inStream = new ObjectInputStream(sock.getInputStream());

  long start = System.currentTimeMillis();

  for(int a=1;a<=100;a++){
  System.out.println("seq number of received vector: "+a);

  @SuppressWarnings("unchecked")   
  Vector <send> response = (Vector<send>)inStream.readObject();
  long end = System.currentTimeMillis();
  System.out.println(response);
  System.out.println("time: "+(end-start));


  }


  sock.close();


}


 }

以及来自客户端的错误:(没有错误,但我想看到至少 100 个 vector ,而不是第一个 vector 的 100 倍):

seq number of received vector: 1
[1, 60, 1]
time: 71
...
seq number of received vector: 100
[1, 60, 1]
time: 79

最佳答案

将对象写入输出流后,如果您第二次发送该对象,则该流仅发送对已发送内容的引用。因此,要么每次创建一个新的 Vector,要么调用 reset()在第二次发送 vector 之前在流上。

请注意,多年来 ArrayList 应该比 Vector 更受青睐。您不应该再使用 Vector。

关于java - Java中如何接收多个 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709096/

相关文章:

iphone - 使用 AFNetworking 和 cancelAllHTTPOperationsWithMethod 取消下载不起作用

android - 如何确定 Android 互联网连接?

ios - 如何在同一个wifi中获取其他设备的主机名?

c++ - 用不同的对象实例化 C++ Vector

c++ - 比较两个 vector 中的元素时出现错误 - 我做错了什么吗?

c++ - 即使根据容量()仍有未使用的空间,std::vector 能否将其数据移动到 emplace_back()处的另一个地址?

java - int i = array.length 比只调用 array.length 两次有什么优势吗?

java - 向数组添加一个值?

java - 局部变量赋值以避免多次转换

java - 使用非默认舍入模式将 long 转换为 double