我在开发一个项目时,遇到一个很是困惑的问题!
当一个用户登录,我将UserBean发送到服务器,服务器进行接收,并加入ArraryList。但是,我用ObjectInputStream 来接收来自服务器端的ArraryList,在服务器端发送数据之前,检查其size为1,而我接收的ArraryLsit的size却为0。就是说明明有人登录客户端却收不到数据。这是为什么??下面是代码片段!(补充一下,这个是个多线程,客户端为applet)。
Client:
......
while(true){
this.receive();
this.send(); }
public void receive() throws IOException, ClassNotFoundException { if (oi == null) {
oi = new ObjectInputStream(so.getInputStream());
}
users = (ArraryList) oi.readObject();//users 为一个static ArraryList。
System.out.println(users.size());
} public void send() throws IOException {
if (oo == null) {
oo = new ObjectOutputStream(so.getOutputStream());
}
oo.writeObject(ChessApplet.user);//ChessApplet.user为一个static UserBean。 }
.....
Server:public class UserProcessing implements Runnable {
static ArrayList userList;
private UserBean user;
private Thread userProcessingThread;
private ServerSocket userSocket;
private Socket socket;
private ObjectInputStream reader;
private ObjectOutputStream writer;
public UserProcessing(ArrayList userList, ServerSocket ss) {
userList = userList;
this.userSocket = ss;
userProcessingThread = new Thread(this);
userProcessingThread.start();
}
public void run() {
try {
socket = userSocket.accept();
FrmInfo.addInfo(socket.getInetAddress().getHostName() + "成功连接本服务器" +
FrmInfo.USER_PORT + "端口!\n");
send(); while (true) {
receive();
if (userList.size() != 0) {
for (int i = 0; i < userList.size(); i++) {
user = (UserBean) userList.get(i);
FrmInfo.addInfo(user.getUserName() + "\n");
}
}
writer.writeObject(userList);
}
} catch (IOException ex) {
FrmInfo.addInfo(ex.getMessage() + "\n");
} catch (ClassNotFoundException ex1) {
ex1.printStackTrace();
}
}
private void init() throws IOException {
socket = userSocket.accept();
FrmInfo.addInfo(socket.getInetAddress().getHostName() + "成功连接本服务器" +
FrmInfo.USER_PORT + "端口!\n");
send();
} private void send() throws IOException {
if (writer == null) {
writer = new ObjectOutputStream(socket.getOutputStream());
}
writer.writeObject(userList);
} private void receive() throws IOException, ClassNotFoundException {
if (reader == null) {
reader = new ObjectInputStream(socket.getInputStream());
}
userList = (ArrayList) reader.readObject(); }}
后来,我以为是ArraryList不支持同步的原因,把ArraryList改成Hashtable,还是不行。
哪位大虾知道阿!在线急等
当一个用户登录,我将UserBean发送到服务器,服务器进行接收,并加入ArraryList。但是,我用ObjectInputStream 来接收来自服务器端的ArraryList,在服务器端发送数据之前,检查其size为1,而我接收的ArraryLsit的size却为0。就是说明明有人登录客户端却收不到数据。这是为什么??下面是代码片段!(补充一下,这个是个多线程,客户端为applet)。
Client:
......
while(true){
this.receive();
this.send(); }
public void receive() throws IOException, ClassNotFoundException { if (oi == null) {
oi = new ObjectInputStream(so.getInputStream());
}
users = (ArraryList) oi.readObject();//users 为一个static ArraryList。
System.out.println(users.size());
} public void send() throws IOException {
if (oo == null) {
oo = new ObjectOutputStream(so.getOutputStream());
}
oo.writeObject(ChessApplet.user);//ChessApplet.user为一个static UserBean。 }
.....
Server:public class UserProcessing implements Runnable {
static ArrayList userList;
private UserBean user;
private Thread userProcessingThread;
private ServerSocket userSocket;
private Socket socket;
private ObjectInputStream reader;
private ObjectOutputStream writer;
public UserProcessing(ArrayList userList, ServerSocket ss) {
userList = userList;
this.userSocket = ss;
userProcessingThread = new Thread(this);
userProcessingThread.start();
}
public void run() {
try {
socket = userSocket.accept();
FrmInfo.addInfo(socket.getInetAddress().getHostName() + "成功连接本服务器" +
FrmInfo.USER_PORT + "端口!\n");
send(); while (true) {
receive();
if (userList.size() != 0) {
for (int i = 0; i < userList.size(); i++) {
user = (UserBean) userList.get(i);
FrmInfo.addInfo(user.getUserName() + "\n");
}
}
writer.writeObject(userList);
}
} catch (IOException ex) {
FrmInfo.addInfo(ex.getMessage() + "\n");
} catch (ClassNotFoundException ex1) {
ex1.printStackTrace();
}
}
private void init() throws IOException {
socket = userSocket.accept();
FrmInfo.addInfo(socket.getInetAddress().getHostName() + "成功连接本服务器" +
FrmInfo.USER_PORT + "端口!\n");
send();
} private void send() throws IOException {
if (writer == null) {
writer = new ObjectOutputStream(socket.getOutputStream());
}
writer.writeObject(userList);
} private void receive() throws IOException, ClassNotFoundException {
if (reader == null) {
reader = new ObjectInputStream(socket.getInputStream());
}
userList = (ArrayList) reader.readObject(); }}
后来,我以为是ArraryList不支持同步的原因,把ArraryList改成Hashtable,还是不行。
哪位大虾知道阿!在线急等
要放在Vector中,用法和ArrayList一样。
是不是客户端把端口屏蔽了??用socket来实现客户端和服务端的连接,会受到防火墙或者网络设置的影响