从Java服务器向android客户端发送序列化对象

时间:2013-06-14 15:19:16

标签: java android sockets object serialization

请注意,我有一个java服务器和一个Android移动客户端,服务器从数据库中获取一个对象(revokedUser)并将其发送到Android客户端。

然而,客户端通过Object输入流接收对象,但在readobject阶段阻塞,我不知道为什么

换句话说,客户端代码中的第一个UIhelper正在打印引用,而第二个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 +
            '}';
}

2 个答案:

答案 0 :(得分:0)

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

如果在不关闭输出流的情况下关闭Socket,则先前写入流中的内容可能无法刷新...并且客户端将无法看到它。

(我不相信这是实际问题......但我认为无论如何你应该修复它。)


第二个问题是您的服务器端和客户端可能会泄漏文件描述符。问题是如果在有Socket的情况下抛出异常,异常可能无法关闭。经常这样做,你的用完了应用程序将用完文件描述符或IP端口号。

处理此问题的正确方法是在finally子句中关闭Socket(和ServerSocket)......以便它始终关闭。

答案 1 :(得分:0)

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

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