请注意,我有一个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 +
'}';
}
答案 0 :(得分:0)
一个潜在的问题是您关闭服务器中的内容的方式。
如果在不关闭输出流的情况下关闭Socket,则先前写入流中的内容可能无法刷新...并且客户端将无法看到它。
(我不相信这是实际问题......但我认为无论如何你应该修复它。)
第二个问题是您的服务器端和客户端可能会泄漏文件描述符。问题是如果在有Socket的情况下抛出异常,异常可能无法关闭。经常这样做,你的用完了应用程序将用完文件描述符或IP端口号。
处理此问题的正确方法是在finally
子句中关闭Socket(和ServerSocket)......以便它始终关闭。
答案 1 :(得分:0)
'ois'.toString()不会产生任何有趣的东西。
您应该始终关闭包裹在套接字周围的输出流,而不是套接字本身。否则你可能会丢失数据。