0

親切に、私はJavaサーバーとAndroidモバイルクライアントを持っています。サーバーはデータベース(revokedUser)からオブジェクトを取得し、それをAndroidクライアントに送信します。

ただし、クライアントはオブジェクト入力ストリームによってオブジェクトを受け取りますが、readobject フェーズでブロックされ、理由がわかりません

つまり、クライアント コードの最初の UIhelper は参照を出力し、2 番目の UIhelper は参照を出力しません。

あなたの助けが必要です

サーバーコード

    public void revokeUser(String userid){

            try {
                Connection conn = Config.getConnection();       
                PreparedStatement stat = conn.prepareStatement(sql);

                stat.setString(1,userid);
                stat.setInt(2, listno);
                stat.setInt(3, counter);
                stat.execute();
                revokeUserzz(userid,listno, counter);
            } catch (SQLException e) {
                e.printStackTrace();
            }}


private void revokeUserzz(String userid, int listno, int counter) {

    RevokedUser revoke = new RevokedUser();

revoke.setuserName(userid);
revoke.setlistNumber(listno);
revoke.setcounter(counter);

try { 
        ServerSocket serversocket = new ServerSocket(4400);
        System.out.println("listening: 8888");
        Socket socket = serversocket.accept();
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(revoke);
        System.out.println("UserName: " +revoke.getuserName());
        System.out.println("ListNumber: " +revoke.getlistNumber());
        System.out.println("Counter: " +revoke.getcounter());

    serversocket.close();
    socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

クライアントコード

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
    Socket socket;
    ObjectInputStream ois = null;
    try {
        socket = new Socket("192.168.1.115", 4400);
        ois = new ObjectInputStream(socket.getInputStream());
        UIHelper.displayText(this, R.id.textView1, "Object =\n" +ois.toString());

        RevokedUser revoke = (RevokedUser) ois.readObject();
        UIHelper.displayText(this, R.id.textView3, "Object =\n" +revoke.getuserName().toString());
    }
}

/////////////////////////////////////////////// ///////////////

シリアライズされたコード

public class RevokedUser implements Serializable { 

private static final long serialVersionUID = -86055680657258429L;

private int listNumber;
private int counter;
private String userName;

public RevokedUser() {
}

public int getlistNumber() {
    return listNumber;
}

public void setlistNumber(int listNumber) {
    this.listNumber = listNumber;
}

public int getcounter() {
    return counter;
}

enter code here

public void setcounter(int counter) {
    this.counter = counter;
}
enter code here
public String getuserName() {
    return userName;
}

public void setuserName(String userName) {
    this.userName = userName;
}

@Override
public String toString() {

    return "RevockedUser{" +
            "userIds='" + userName + '\'' +
            ", listNumber=" + listNumber +
            ", counter=" + counter +
            '}';
}
4

2 に答える 2

0

'ois'.toString() は興味深いものを何も生成しません。

ソケット自体ではなく、ソケットをラップした出力ストリームを常に閉じる必要があります。そうしないと、データが失われる可能性があります。

于 2013-06-15T00:44:34.277 に答える
0

潜在的な問題の 1 つは、サーバー内のものを閉じる方法です。

最初に出力ストリームを閉じずに Socket を閉じると、以前にストリームに書き込んだ内容がフラッシュされず、クライアントがそれを認識できない可能性があります。

(これが実際の問題であるとは確信していませんが、とにかく修正する必要があると思います。)


2 つ目の問題は、サーバー側とクライアント側がファイル記述子をリークする可能性があることです。問題は、ソケットがあるときに例外がスローされた場合、例外が閉じられない可能性があることです。これを頻繁に行うと、アプリケーションが不足し、ファイル記述子または IP ポート番号が不足します。

これに対処する正しい方法は、finally節で Socket (および ServerSocket) を閉じることです ... 常に閉じられるようにします。

于 2013-06-14T16:54:15.737 に答える