yesno123456 2014年01月12日
做毕业设计遇到麻烦了,求各位大神帮帮忙!怎样将服务器中的list对象,发到各个客户端的线程里面。
这是服务器代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package chat;

/**
*
* @author Administrator
*/
import java.awt.List;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
import java.net.*;
import mylist.MyList;

public class Server extends Frame implements ActionListener,Runnable{
////////////////////////////////////////////////
////////////////////////////////////////////////
private Button 启动;
private Button 结束;
static MyList ClientList; //实现了序列化的list
private Label label;
private Thread Fthread;
boolean flag=false;

/////////////////////////////////////////////

///////////////////////////////////////////
public void run(){
启动.setEnabled(false);
ServerSocket operator1;
Socket server1;

java.util.List<ServerThread> clients=new java.util.ArrayList<ServerThread>();

try{
operator1=new ServerSocket (9888); //接线员端口号
// operator2=new ServerSocket(9001);

for(int m=0;m<15;m++){ //最多连接15个客户端
System.out.println("服务器启动通信线程等待客户端");
server1=operator1.accept(); //进入阻塞,等待客户端



ClientList.add(server1.getInetAddress().toString()); //改变了
label.setText("当前在线人数:"+ClientList.getItemCount());
//////////////////////////////

/////////////////////////////

/////////////
//没接通一个客户端,就将这个客户端交给线程
ServerThread thread=new ServerThread(server1,this); //单独的客户端线程



clients.add(thread); //每当有一个新的客户端连接近来就要为所有客户端线程发送客户端列表

thread.startThread(clients); //初始化服务器线程中的ArrayList
thread.start();
//for(int k=0;k<clients.size();k++){
System.out.println(ClientList.getItemCount());
clients.get(0).sendObject(ClientList);

//}
//遍历所有线程发送列表

///////////////////////////////////////
//根据这里的线程来set

//改变每个线程的list
//Thread thread1=new Thread(new ServerListThread(this.ClientList));//列表线程
//thread1.start();
//clients.get(m).start();
///////////////////////////////////////
}

}catch(Exception ex){
System.out.println(ex+"连接错误1");

}
}
void removeClientList(){
ClientList.remove(ClientList.getItemCount()-1);
}//移除客户端列表
void setLabel(){
label.setText("当前在线人数:"+ClientList.getItemCount());
}//修改在线人数
Server(){
启动=new Button("启动");
结束=new Button("结束");
Fthread=new Thread(this);

ClientList=new MyList(15);
/////////////////////////////

//////////////////////////////
ClientList.setBackground(Color.WHITE);
Box box=Box.createVerticalBox();

box.add(ClientList);
label=new Label("当前在线人数:"+ClientList.getItemCount());
box.add(label);


Panel panel=new Panel();
启动.addActionListener(this);
panel.add(启动);
panel.add(结束);

this.setBounds(20, 20, 300, 350);
this.add(box,"North");
this.add(panel);
this.setResizable(false);
this.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==启动){
Fthread.start(); //启动服务器窗体线程 将服务器主线程交给这个线程
}
}

public static void main(String[] args){
new Server();

}
}
这是服务器线程的代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package chat;

import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
import java.net.*;
import mylist.MyList;
/**
*
* @author Administrator
*/
//服务器为客户端所创建的tcp单独通信线程
public class ServerThread extends Thread {
private Socket server;
private Server frame;
private String msg;
private java.util.List<ServerThread> clients;
private DataOutputStream out;
private DataInputStream in;

OutputStream os;
ObjectOutputStream oos;
ServerThread(Socket server,Server frame){
this.server=server;
this.frame=frame;
try{
out=new DataOutputStream(server.getOutputStream());
os=server.getOutputStream();
oos=new ObjectOutputStream(os);
}catch(Exception ex){System.err.println(ex);}
}
void startThread(List<ServerThread> clients) {
this.clients=clients;
}
void sendMsg(String str){

try{
out.writeUTF(str);
}catch(Exception ex){
System.out.println(ex);
}
}
void sendObject(MyList list) throws IOException{
try{
System.out.println(list.getItemCount()+"发送前");
oos.writeObject(list);
}catch(Exception ex){throw ex;}
}

public void run(){
try{
in=new DataInputStream(server.getInputStream());

while(true){
msg=in.readUTF();
System.out.println(clients.size());/////////////////////
System.out.println(msg);

for(int k=0;k<clients.size();k++){
ServerThread thread=clients.get(k); //获得客户端
thread.sendMsg(msg);
//为每一个线程包括自己发送msg
}
//接收从客户端发来的消息
//这里改为将信息传回给主线程或将信息发给各个线程
Thread.sleep(500);

}
}catch(Exception ex){
System.out.println(ex+"2123");
clients.remove(this);

frame.removeClientList();
frame.setLabel(); //改变服务器客户端列表

}
}

//将接收回来的信息发给各个客户端

}

这是客户端用来测试的代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package chatclient;
import java.awt.List;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import mylist.MyList;
/**
*
* @author Administrator
*/
public class Test {
public static void main(String[] args){
MyList list;
InputStream is;
ObjectInputStream ois;


try {
Socket socket=new Socket("192.168.50.13",9888);
is=socket.getInputStream();
ois=new ObjectInputStream(is);
while(true){
list=(MyList) ois.readObject();
System.out.println(list.getItemCount());

}
}catch (Exception ex) {
ex.printStackTrace();
}
}
}



现在的问题是当我启动多个测试客户端时,为什么客户端每次收到的list对象都是一样呢?

如何让每一个客户端收到的list与服务器相同呢?

里面的mylist对象是实现了序列化的java.awt.list的对象。
...全文
1021 点赞 收藏 2
写回复
2 条回复

还没有回复,快来抢沙发~

发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告