用c/s结构做网络实验室,分别为老师和学生端,老师和学生端用socket进行通信老师端有启动的按钮,有如下方法
public void startService(){
   try{
if(serverSocket==null){
serverSocket = new ServerSocket(8888,100);
System.out.println("服务器启动......监听8888端口");
//开启线程
server = new ServerListener(serverSocket,jList1,listModel1);
server.start();
}else{
System.out.println("服务器已经启动.....");
}

}catch(Exception e){
e.printStackTrace();
System.out.println("服务器启动错误");
}
}
当启动的时候开启线程,老师端阻塞,(多用户把socket放入数组)等待接收对象流,其中提供了socket的获取方法getSocket()下面为服务器线程:
public class ServerListener extends Thread {
ServerSocket server;
Socket  socket =null;
User user;
JList jList1;
DefaultListModel listModel1;
public boolean isStop;
   public ServerListener(ServerSocket server,JList jList1,DefaultListModel listModel1){
   this.server = server;
   this.jList1 = jList1;
   this.listModel1 =listModel1;
   isStop = false;
   }
   public void run(){
  while(!isStop && !server.isClosed()){    
   try {
socket = server.accept();
 ObjectInputStream   ois   =   new   ObjectInputStream(new   BufferedInputStream(socket.getInputStream()));
 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));  
 user =(User) ois.readObject(); if(!listModel1.contains(user.getName())){
listModel1.addElement(user.getName());
jList1.setModel(listModel1);
}
} catch (EOFException e){
System.out.println("这是合法的,客户端已经关闭");

}catch (Exception e) {
try{
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
   }
    }
    public Socket getSocket() {
      return socket;
     }
 
}
在ServerListener.java获取socket为的是在添加图片的时候获得这个socket进行数据的传送
在添加图片中也开启一个线程,下面为线程:public class ServerImage  extends Thread {
    private Socket socket;
    private String path;
public ServerImage(Socket socket,String path) {
this.socket = socket;
this.path = path;
} public void run() {
try {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
                        //path为图片的路径
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
while(true){
int read =0;
    if(fis!=null){
     read = fis.read(b);
    }
    if(read == -1) break;
    dos.write(b, 0, read);
}
dos.flush();
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }}
学生端当登陆的时候进行获取对象,学生端界面有个添加按钮,当点击添加按钮的时候把对象传给老师端,同时等待接受输入流获取图片进行加载,下面为学生端的线程:
public class ClientListener extends Thread {
Socket socket;
String ip;
int port;
User user;
JFrame jframe;
JLabel jLabel1;

ObjectOutputStream oos =null; 
DataInputStream dis =null;
public ClientListener(Socket socket,String ip,int port,User user,JLabel jLabel1){
super();
this.socket = socket;
this.ip = ip;
this.port = port;
this.user =user;
this.jLabel1=jLabel1;

}
public void run(){
try{
oos   =   new   ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

oos.writeObject(user);
oos.flush();


if(dis !=null){
      
File file = new File("d:\\clientimage\\new1.jpg");
  byte[] b = new byte[1024];
FileOutputStream fos = new FileOutputStream(file);
  while(true){
  int write =0;
  if(dis !=null){
  write = dis.read(b);
  }
  if(write == -1) break;
  fos.write(b, 0, write);
  }

  fos.flush();
  fos.close();
  jLabel1.setIcon(new ImageIcon("d:\\clientimage\\new1.jpg"));
 System.out.println("----接收图片完毕--------");
 
}

  
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}  
}
问题1
当老师端启动后,等待学生端的连接,如果学生端来连接,学生端把对象流输入到老师端,老师端进行获取对象,添加学生,当老师端界面点击加载图片按钮的时候,图片列表中有图片的名字,选择点击添加,进行传图片的操作,学生端开启的线程接收图片并加载,问题是学生端的发送和接收都写在一个线程里,意味着当点击一次添加老师的按钮的时候开启传送和等待接受,老师端如果添加图片2次,第2次就会出现socket is close的错误,也就是说要学生点击2次添加老师的按钮才能正常的接受2次的图片,这是个问题, 如何把学生端这种情况接收和发送分离,使服务器传图片的时候能够加载图片不影响有没有什么好方法(还是我写的不对)
问题2
学生端加载图片后,图片上有3个路由器要求能点击,如果换图片的话,如何能都进行动态的换telnet ip那,有没有什么好的方法和解决方案。
本人菜鸟,希望大侠们指教。