1

저는 Android와 Windows에 Java가 포함 된 서버 클라이언트 응용 프로그램을 작성하고 있습니다. 확인을 위해 사용자의 정보 (사용자 이름 및 암호)를 서버에 보내려고합니다. 클라이언트는 정보를 포함하는 객체를 전송하지만 서버는 그것을받지 못합니다!ObjectInputStream을 통해 객체 받기

package Model; 

import java.io.Serializable; 

public class StringObject implements Serializable { 

private static final long serialVersionUID = 1L; 
private String Username=null; 
private String Password=null; 

public void setPassword(String Password){ 
    this.Password=Password; 
} 
public void setUsername(String Username){ 
    this.Username=Username; 
} 
public String getPassword(){ 
    return Password; 
} 
public String getUsername(){ 
    return Username; 
} 
} 

클라이언트 코드 :

private void Login(){ 
    try { 
ObjectOutputStream OutObj=new ObjectOutputStream(newBufferedOutputStream(connection.getOutputStream())); 
       OutObj.writeObject(UserPass); 
       OutObj.flush(); 
      } catch (IOException e) { 
     Log.d("Application: ",e.toString());} 

(I이 라인 전에 개체 변수를 설정 한)

및 서버 코드 :

ObjectInputStream inObj = new ObjectInputStream(new   BufferedInputStream(connection.getInputStream())); 
     UserPass=(StringObject) inObj.readObject(); 
     System.out.println("UserName: " + UserPass.getUsername()); 
     System.out.println("Password: " + UserPass.getPassword()); 
여기 는 Object 클래스입니다

클라이언트 프로그램 (안드로이드)이 오류로 인해 충돌합니다. catch uncomaught E로 종료됩니다. xception. (소켓 및 I/O 코드 라인이 구분 스레드에)

07-15 12:43:59.626: W/dalvikvm(1306): threadid=13: thread exiting with uncaught exception (group=0x40a71930) 
07-15 12:43:59.626: E/AndroidRuntime(1306): FATAL EXCEPTION: Thread-89 
07-15 12:43:59.626: E/AndroidRuntime(1306): java.lang.NullPointerException 
07-15 12:43:59.626: E/AndroidRuntime(1306):  at com.shayan.filesharing.ConnectionThread.Login(ConnectionThread.java:90) 
07-15 12:43:59.626: E/AndroidRuntime(1306):  at com.shayan.filesharing.ConnectionThread.ProcessMessage(ConnectionThread.java:70) 
07-15 12:43:59.626: E/AndroidRuntime(1306):  at com.shayan.filesharing.ConnectionThread.run(ConnectionThread.java:47) 

하지만이 ObjectOutputStream/ObjectInputStreamBufferedWriter/bufferedReader로 교체 할 때 그것을 잘 작동합니다! 아무도 왜 이런 일이 일어 났는지 말해 줄 수 있니?

+0

크래시 덤프와 오류 코드를 붙여 넣으면 어디에 있는지, 왜 그럴까요? – Shark

+0

확실! 내 질문을 편집했습니다 ... –

+0

로그인 방법에서 줄 90은 어느 것입니까? – user1676075

답변

2

트랜잭션 당 새 개체 스트림을 만들지 마십시오. 양쪽 끝에서 소켓의 수명 동안 동일한 흐름을 사용하십시오. 객체 스트림은 헤더를 읽고 쓰므로 소켓 당 여러 인스턴스를 생성하면 상대방과 동기화되지 않게됩니다.

+0

BufferedWriter를 통해 서버에 메시지를 보내고 ObjectOutpuStream을 통해 객체를 보내야합니다. 두 경우 모두 connection.getOutputStream()을 사용합니다. 나는 어떻게해야합니까? –

+0

문제는 쓰기가 아닙니다. 문제는 독서입니다. BufferedInputStream/BufferedReader를 사용할 수 있지만 연결을 끊고 두 번째 판독기를 동일한 스트림에 연결하면 첫 번째 bufferedreader가 실제로 사용 된 래퍼보다 많은 바이트를 읽었을 수 있습니다. 예를 들어, ObjectInputStream (BufferedInputStream (InputSteam))이있는 경우 readObject()는 Buffered 스트림에있는 객체보다 더 많은 바이트를 읽을 수 있습니다 ("유효한"텍스트와 같음). 입력 스트림에 다른 판독기를 사용하면 데이터가 더 이상 존재하지 않을 수 있습니다. – user1676075

+0

아주 좋은! 감사. 그래서 내가 무엇을해야하니? BufferedReader.readLine() 및 ObjectInputStream 대신에readObject() 무엇을 사용해야합니까? –

0

는 인용구 :

07-15 12:43:59.626: E/AndroidRuntime(1306): java.lang.NullPointerException 
    07-15 12:43:59.626: E/AndroidRuntime(1306):  at com.shayan.filesharing.ConnectionThread.Login(ConnectionThread.java:90) 
    07-15 12:43:59.626: E/AndroidRuntime(1306):  at com.shayan.filesharing.ConnectionThread.ProcessMessage(ConnectionThread.java:70) 
    07-15 12:43:59.626: E/AndroidRuntime(1306):  at com.shayan.filesharing.ConnectionThread.run(ConnectionThread.java:47) 

당신은 line 90에 미세 ConnectionThread.java를 게재 할 수 있습니까? 네트워크에 아무런 관련이 없을 수도있는 nullpointer를 얻고 있지만 잘못된/초기화되지 않은 참조입니다.

+0

라인 90을 의미합니까? 예 : if (in.readLine(). equals ("Valid")) {\t \t \t \t \t Log.d ("Application :", "Valid"); } 아마도 in.readline()은 null이지만 (Input Stream)은 이미 초기화되어 있습니다! –

+0

readLine()의 결과를 확인한 후 다른 작업을 수행해야합니다. – EJP

관련 문제