每启动一个Client,Server端就会给所有Client端发送一个信息,每个Client端得到的String消息都能是最新的,但是List里面的names却是最开始的那一个,是为什么?用到的三个类如下://Message类,封装传输的信息。import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;public class Message implements Serializable{

List names = new ArrayList();

String msg;

public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} public List getNames() {
return names;
} public void setNames(List names) {
this.names = names;
}

}//Server 类
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server { List list = new ArrayList(); List names = new ArrayList(); Socket sk; ObjectOutputStream oos; public void startServer() {
try {
ServerSocket ss = new ServerSocket(8887); while (true) {
sk = ss.accept();
oos = new ObjectOutputStream(sk.getOutputStream());
String name = ""+sk.getRemoteSocketAddress()+sk.getPort();
names.add(name);
list.add(oos);
setName();
}
} catch (Exception es) {
es.getStackTrace();
}
} public void setName(){
Message msg= new Message();

msg.setNames(names);
msg.setMsg(""+Math.random());

for(int i=0;i<list.size();i++){
ObjectOutputStream oos = (ObjectOutputStream)list.get(i);

try {
oos.writeObject(msg);

} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
Server s = new Server();
s.startServer();
}
}//Client 类
import java.awt.GridLayout;
import java.io.ObjectInputStream;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextArea;public class Client { JFrame jfc;
Socket sc;
JList jlist = new JList();
JTextArea jta1 = new JTextArea();
JPanel jp = new JPanel(); public Client() {
jfc = new JFrame();
JList jlist = new JList();
jp.setLayout(new GridLayout(1, 2));
jp.add(jta1);
jp.add(jlist);
jfc.add(jp);
jfc.setBounds(200, 100, 300, 300);
jfc.setVisible(true); try {
sc = new Socket("127.0.0.1", 8887); } catch (Exception e) {
e.printStackTrace();
} ClientThread ct = new ClientThread();
Thread t = new Thread(ct);
t.start();
} public class ClientThread implements Runnable { public void run() {
boolean b = true;
try {
ObjectInputStream ois = new ObjectInputStream(sc
.getInputStream()); while (b) {
Message msg = (Message) ois.readObject();
Object[] obj = msg.getNames().toArray(); System.out.println(obj.length);
jlist.setListData(obj);
jta1.append(obj.toString() + "\n" + msg.getMsg() + "\n"); } } catch (Exception e) {
e.printStackTrace();
}
} } public static void main(String[] args) {
Client c = new Client();
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【shchxiang】截止到2008-07-08 22:55:04的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html