0

Kindly, I am having a java server and an android mobile client, the server gets an object from database (revokedUser) and sends it to the android client.

However the client receives the object by Object input stream but blocks at the readobject phase and I don't know why

In other mean, the first UIhelper in the client code is printing a reference while the second UIhelper is not

Please need your help

Server Code

    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();
    }
}

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

Client Code

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());
    }
}

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

Serialized Code

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

一个潜在的问题是您在服务器中关闭内容的方式。

如果您在没有先关闭输出流的情况下关闭了 Socket,那么您之前写入流中的内容可能不会被刷新......并且客户端将看不到它。

(我不相信这是真正的问题......但我认为你还是应该解决它。)


第二个问题是您的服务器端和客户端可能会泄漏文件描述符。问题是,如果在您拥有 Socket 时抛出异常,则该异常可能不会被关闭。经常这样做,您的应用程序将用尽文件描述符或 IP 端口号。

处理这个问题的正确方法是在一个finally子句中关闭 Socket(和 ServerSocket)......以便它总是被关闭。

于 2013-06-14T16:54:15.737 回答
0

'ois'.toString() 不会产生任何有趣的东西。

您应该始终关闭已包裹在套接字周围的输出流,而不是套接字本身。否则您可能会丢失数据。

于 2013-06-15T00:44:34.277 回答