高手挑战题!!!

softbank softbank 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
代码已经精简可运行!问题已经标注请详细解答谢谢……
server端:
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.DefaultListModel;

public class ChatServer {
ServerSocket ss = null;
DefaultListModel listModel = new DefaultListModel();
List<Client> clients = new ArrayList<Client>();

public static void main(String[] args) {
new ChatServer();
}
public ChatServer() {
try {
ss = new ServerSocket(8888);//server等待连接
while(true) {
Socket s = ss.accept();
Client c = new Client(s);
new Thread(c).start();
clients.add(c);
}
} catch (IOException e) {
e.printStackTrace();
}
}

class Client implements Runnable {//为每个client启动一个线程
private Socket s;
private ObjectInputStream dis = null;
private ObjectOutputStream dos = null;
public Client(Socket s) {
this.s = s;
try {
dos = new ObjectOutputStream(s.getOutputStream());
dis = new ObjectInputStream(s.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(Messages str) throws IOException {
dos.writeObject(str);
dos.flush();
}
public void run() {
try {
while(true) {
Messages ms = (Messages) dis.readObject();
listModel.addElement(ms.clientName);
ms.listModel = listModel;
System.out.println(ms.listModel);//问题出在这里!我这里打印ms.listmodel完全正确(即启动3个client打印[kk,kk,kk],但是问题出现在了下面的转发!请看client接收代码)
for(Client client:clients) {
client.send(ms);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

}
}
client端:
import java.io.*;
import java.net.*;
import javax.swing.JList;

public class ChatClient{
ObjectOutputStream dos = null;
ObjectInputStream dis = null;
JList list;

ChatClient() {
String[] str = {"a","b","c"};
list = new JList();

connect();
new Thread(new RecvThread()).start();
}

public void connect() {
try {
Socket s = new Socket("127.0.0.1", 8888);
dos = new ObjectOutputStream(s.getOutputStream());
dis = new ObjectInputStream(s.getInputStream());
Messages ms = new Messages();
ms.clientName = "kk";
try {
dos.writeObject(ms);
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

private class RecvThread implements Runnable {
@Override
public void run() {
try {
while(true) {
Messages str = (Messages) dis.readObject();
list.setModel(str.listModel);
System.out.println(list.getModel());//问题在这里接收时新开的clientlistmodel为[kk,kk]可是旧client为[kk]和sever端明明是一个messages为什么这里读不出来
}
} catch (SocketException e) {
System.out.println("退出了,bye!");
} catch (EOFException e) {
System.out.println("推出了,bye - bye!");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
new ChatClient();
}
}
序列化message
import javax.swing.DefaultListModel;


public class Messages implements java.io.Serializable {
private static final long serialVersionUID = 1L;
public String clientName,msg;
public DefaultListModel listModel = new DefaultListModel();
public int flag = 0,i;
}
...全文
评论 3
收藏 已收藏
分享
返回顶部
softbank
Java SE 62,620 成员 307,251 内容