2010-05-09 2 views
1

클라이언트 서버 응용 프로그램을 작성하고 있지만 서버 측에서 전송할 때 클라이언트 측에서 동일한 바이트를받지 못합니다. 서버 쪽에서 나는 .write(bytes[]) 메서드를 사용했습니다. 클라이언트 측에서는 .readFully(byte[]) 메소드를 사용했습니다. 의견이 있으십니까?DataOutputStream, 일부 비트가 손실되지 않습니다

보낸 된 코드 :

 System.out.println("Server got connection from " + connectionFromClient.getPort()); 
     in = connectionFromClient.getInputStream(); 
     OutputStream out = connectionFromClient.getOutputStream(); 
     DataOutputStream dataOut = new DataOutputStream(out); 
     LicenseList licenses = new LicenseList(); 
     String ValidIDs = licenses.getAllIDs(); 
     System.out.println(ValidIDs); 
     Encryption enc = new Encryption(); 
     //byte[] dd = enc.encrypt(ValidIDs); 
     byte[] dd = enc.encrypt(ValidIDs); 
     String tobesent = new String(dd); 
     //byte[] rsult = enc.decrypt(dd); 
     //String tt = String(rsult); 
     System.out.println("The sent data**********************************************"); 
     System.out.println(dd); 
     String temp = new String(dd); 
     System.out.println(temp); 
     System.out.println("*************************************************************"); 
     //BufferedWriter bf = new BufferedWriter(OutputStreamWriter(out)); 
     dataOut.write(ValidIDs.getBytes()); 
     dataOut.flush(); 
     System.out.println("********Testing**************"); 
     System.out.println("Here are the ids:::"); 
     System.out.println(licenses.getAllIDs()); 
     System.out.println("**********************"); 

클라이언트 사이드 :

  Socket connectionToServer = new Socket("127.0.0.1", 7050); 
     InputStream in = connectionToServer.getInputStream(); 
     DataInputStream dis = new DataInputStream(in); 

     int available = dis.available(); 
     byte[] data = new byte[available]; 
     // dis.readFully(data); 
     dis.read(data); 
     System.out.println("The received Data*****************************************"); 
     System.out.println(available); 
     System.out.println(data); 
     System.out.println("***********************************************************"); 
+0

보낸 몇 바이트의 예와 대신받은 내용을 제공 할 수 있습니까? –

+0

글을 쓰고 읽는 코드를 게시 할 수 있습니까? – Zaki

+0

아래는 클래스 프로젝트를위한 것입니다. 그런 종류의 일을 위해'숙제'태그를 미래에 사용하십시오. 답변을 올바르게 타겟팅하여 사람들이 더 잘 도울 수있게 도와줍니다. –

답변

2

in.available()의 계약은 아무 것도 보장하지 않습니다. 아래 API에서 발췌 참조 :

주의 InputStream의 일부 구현 스트림에서 총 바이트 수를 반환합니다 동안 그 많은 사람들이하지 않습니다. 이 스트림의 모든 데이터를 보관 유지하는 버퍼를 할당하려면,이 메소드의 반환 값을 사용하는 것은 적절하지는 않습니다.

코드는 기본적으로 전송 된 모든 데이터가 즉시 사용 가능하며 그에 따라 in.available()에 의해보고됩니다.

dataOut.writeInt(theBytes.length); 

를 한 후 수신 측에서 그 정수를 사용

하면, 발신자 측에 발송됩니다 얼마나 많은 바이트 이야기, 정수를 전송하여 시작할 수 있습니다, 당신은 모든 데이터를 얻을 수 있는지 확인하려면

byte[] data = new byte[dis.readInt()]; 

당신이 보내 바이트가 String에서 나오나요

: 배열을 만들 때? 이 경우 문자 세트에주의해야합니다. 보낸 사람과받는 사람이 다른 기본 문자 집합을 가질 수 있습니다.

예를 들어 str.getBytes("UTF-8")new String(bytes, "UTF-8")을 사용하여 수신자가 송신자가 의도 한대로 바이트를 해석하는지 확인할 수 있습니다.

+0

잘이 응용 프로그램은 클래스 프로젝트에만 클라이언트와 서버 응용 프로그램이 동일한 컴퓨터 (내 컴퓨터) –

+0

에서 실행되는데 어떻게 모든 보낸 데이터를 가져올 수 있습니까? 코드 –

+0

의 코드 스 니펫을 게시 해 주시면 감사하겠습니다. – aioobe

관련 문제