2017-10-14 6 views
1

私はちょうどシリアライゼーションについて学び始め、それを実装しようとしました。私はserverclientstudentクラスを持っています。 serverは私の学生クラスの初期インスタンスを作成します。次に、クライアントはサーバに接続し、生徒に関連付けられた属性で改ざんする、すなわちGPAを上げる。readObject()はプログラムをハングします

クラスのreadObject()を試してみると、何らかの理由で自分のコードが表示されない場合があります。理由を理解できません。繰り返しますが、私はこの話題についてはとても新しいので、もし私が大切なことや誤ったことを誤解しているなら、それを指摘してください。どんな助けもありがとうございます。

Serverクラス:

import java.io.*; 
import java.net.*; 

public class Server 
{ 
    Student s1 = null; 
    ServerSocket sock; 
    ListeningThread thread; 

    public Server(int port) throws IOException { 

     sock = new ServerSocket(port); 

    } // end of constructor 
    // starts the listening thread 
    public void start() { 

     thread = new ListeningThread(); 
     thread.start(); 

    } // end of start method 

    // stops the listening thread 
    public void shutdown() throws IOException { 

     thread.shutdown(); 

    } // end of start method 

    private class ListeningThread extends Thread 
    { 
    Student s1 = new Student(0.5, "ABCDEFG", "Computer Science and Pure Math"); 
    boolean keep_going; 

    public ListeningThread() { 
     super("The thread that listens"); 
    } 

    public void shutdown() throws IOException 
    { 
     keep_going = false; 
     System.out.println("closing server socket"); 
     sock.close(); 

     System.out.println("Waiting for listening thread to exit"); 
     try { join(); } 
     catch(InterruptedException e) {} 

     System.out.println("Server shut down"); 

    } 
    public void run() 
    { 
     // Show student info before connecting to client 
     System.out.println("Student Name is : " + s1.getStudentName()); 
     System.out.println("Student Major is : " + s1.getStudentMajor()); 
     System.out.println("Student GPA is : "+ s1.getStudentGPA()); 
     try 
     { 
      boolean keep_going = true; 
      while(keep_going) 
      { 
      System.out.println("Listening for connection on port "+ 
           sock.getLocalPort()); 
      Socket s = sock.accept(); 

      ClientHandler handler = new ClientHandler(s); 
      handler.start(); 

      System.out.println("Got a connection"); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 

    } // end of run method 

    } // end of ListeningThread class 

private class ClientHandler extends Thread 
{ 
     ObjectOutputStream serverOutputStream = null; 
     ObjectInputStream serverInputStream = null; 

     Socket socket; 
    /************************************************************************* 
    * @param socket The Socket object returned by calling accept() on the 
    * ServerSocket. 
    *************************************************************************/ 
    public ClientHandler(Socket socket) throws Exception { 

     this.socket = socket; 

    } // end of constructor 
    public void run() 
    { 
     try 
     { 
     serverInputStream = new ObjectInputStream(socket.getInputStream()); 
     serverOutputStream = new ObjectOutputStream(socket.getOutputStream()); 

     s1 = (Student)serverInputStream.readObject(); 
     System.out.println("DATA HAS BEEN TAMPERED"); 
     serverOutputStream.writeObject(s1); 
     serverOutputStream.flush(); 
      // Show student info after connecting to client, once we tampered with it 
     System.out.println("Student Name is : " + s1.getStudentName()); 
     System.out.println("Student Major is : " + s1.getStudentMajor()); 
     System.out.println("Student GPA is : "+ s1.getStudentGPA()); 

     serverInputStream.close(); 
     }catch(Exception e){e.printStackTrace();} 
    } // end of run method 

    } // end of ClientHandler inner class 
} 

クライアントクラス:

import java.io.*; 
import java.net.*; 

public class Main 
{ 
    public static void main(String[] arg) throws Exception 
    { 
     Student s1 = null; 

     Socket socketConnection = new Socket("127.0.0.1", 9876); 

     ObjectInputStream clientInputStream = new 
     ObjectInputStream(socketConnection.getInputStream()); 

     ObjectOutputStream clientOutputStream = new 
     ObjectOutputStream(socketConnection.getOutputStream()); 

     //System.out.println("I'VE TAMPERED WITH DATA"); 
     //clientOutputStream.writeObject(s1); 

     /***************************************************************** 
      * Funny thing here that stomped me for quite a while is that 
      * .readObject() and .writeObject() exceptions aren't handled by 
      * IOException, which makes sense. And I was trying to catch an 
      * IOException for about 2 hours till I realized that. 
      *****************************************************************/ 

      s1 = (Student)clientInputStream.readObject(); 
      s1.setStudentGPA(4.00); // <<<---- hehe 

      clientOutputStream.writeObject(s1); 
      clientOutputStream.flush(); 

      System.out.println("I'VE TAMPERED WITH DATA 1"); 

     clientInputStream.close(); 
     clientOutputStream.close(); 
     System.out.println("I'VE TAMPERED WITH DATA 1"); 
    } 
} 

、私の学生のオブジェクトクラス:

import java.io.*; 
import java.util.*; 

public class Student implements Serializable 
{ 
    private String studentName, studentMajor; 
    private double studentGPA; 

    Student(double gpa, String name, String major) 
    { 
     studentName = name; 
     studentMajor= major; 
     studentGPA = gpa; 
    } 
    //------------------------------------------------------- 
    public String getStudentName() 
    { 
     return studentName ; 
    } 
    public String getStudentMajor() 
    { 
    return studentMajor ; 
    } 
    public double getStudentGPA() 
    { 
    return studentGPA ; 
    } 
    //------------------------------------------------------- 
    public void setStudentGPA(double gpa) 
    { 
    studentGPA = gpa; 
    } 
} 

答えて

2

ここ

は私のクラスであります編集:

私はあなたのコードを見て、あなたがオブジェクトを最初に読んで、クライアントとサーバーの両方で次の書き込みを試みたことがわかりました。

クライアントとサーバーの両方が、データを待っているので、最初は読んではいけません。

読み取りと書き込みの順序を変更するか、読み取りと書き込みを別のスレッドに実装します。

古い答えは:一部のデータが受信されるまで

方法readObject()は、現在のスレッドをブロックすることになっている、すなわち、それは進まないだろう。

解決方法は、ネットワーク関連のコードをクライアントの別のバックグラウンドスレッドに実装することです。

+0

おそらくそれに沿って擬似コードを提供できますか?私は理解していると思うが、助けになるだろう。 –

+0

既にサーバー側にスレッドを実装していますが、同様のアプローチを使用してください。 –

+0

さて、私はそれを試してみましょう。 –

関連する問題