2012-07-29 5 views
0

저는 자바에서 초보자입니다. 통신 클라이언트 - 서버에 문제가 있습니다. 하나 이상의 벡터를 읽는 방법을 모르겠습니다. 도와 주셔서 감사합니다 :). 내 코드는 다음과 같습니다 서버 : 서버 측Java에서 둘 이상의 벡터를받는 방법?

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 번 벡터가 아닌 100 번 벡터를 보려고합니다.)

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

답변

1

개체가 출력 스트림에 일단 기록되면 두 번째로 보내면 스트림은 이미 보낸 개체에 대한 참조 만 보냅니다. 따라서 매번 새로운 벡터를 생성하거나 벡터에 두 번째로 보내기 전에 스트림에서 reset()을 호출하십시오.

ArrayList가 Vector보다 몇 년 동안 선호되어야한다는 점에 유의하십시오. 더 이상 Vector를 사용하면 안됩니다.

+0

고맙습니다 만, Array List를 사용하는 방법에 대해 잘 모릅니다. –

+0

그냥 google : "java arraylist" –

+1

http://docs.oracle.com/javase/6/docs/api/. javadoc은 북마크에 있어야하며 클래스를 사용하는 방법을 이해해야 할 때마다 읽어야합니다. 전체 자습서가 필요한 경우 "Java 콜렉션 자습서"로 google 할 수도 있습니다. ArrayList는 Vector와 거의 같은 메소드를 가지고 있습니다. 이것들은 모두 List 인터페이스의 구현입니다. –

0

서버 쪽 예외. 클라이언트는 100 벡터를 읽은 후 소켓을 닫습니다. 서버 측은 여전히 ​​쓸 벡터가 더 많습니다. 그래서 'java.net.SocketException의를 : 소켓 폐쇄'보고 당신은 후드 아래에 송신 루프

new 벡터 매번 작성해야합니다, 클라이언트의 반복 문제 '에 대한

, 자바 ObjectOutputStream에 /의 InputStream는 것 모든 객체의 '참조'가 직렬화되어 있으므로 객체 참조 맵을 클라이언트 측에서 재구성 할 수 있습니다. 객체가 직렬화되어 이전에 전송 된 경우 '참조'만 표시되고 전송됩니다. 하나의 객체가 쓰기라면 클라이언트는 하나의 객체만을받습니다. 자세한 내용은 소스 코드를 참조하십시오 writeObject

관련 문제