⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 whiteboardserver.java

📁 一个基于swing的网络白板
💻 JAVA
字号:
package mywb;

import java.io.*;
import java.net.*;
import java.util.*;

public class WhiteBoardServer extends Thread {
  public static int port = 1234;
  static PaintedObjects paintedObjects = new PaintedObjects();
  static Vector rlineVector = new Vector();
  static Vector streamVector = new Vector();
  Socket socket;

  public WhiteBoardServer (Socket socket) {
    System.out.println ("Accepted from " + socket.getInetAddress () + ".");
    this.socket = socket;
  }

  public void run () {
    try {
      ObjectOutputStream outputStream = new ObjectOutputStream (
        new BufferedOutputStream (socket.getOutputStream ()));
      outputStream.flush ();
      ObjectInputStream inputStream = new ObjectInputStream (
        new BufferedInputStream (socket.getInputStream ()));
      handle (inputStream, outputStream);
    } catch (Exception ex) {
      ex.printStackTrace ();
    } finally {
      System.out.println ("从 " + socket.getInetAddress () + " 断开");
      try {
        socket.close ();
      } catch (IOException ignored) {
      }
    }
  }

  void handle (ObjectInputStream inputStream, ObjectOutputStream outputStream) throws IOException, ClassNotFoundException {
    try {
      synchronized (streamVector) {
        //建立客户端通信流
        streamVector.addElement (outputStream);
        outputStream.writeObject (new LoginMessage(((PaintedObjects) paintedObjects.clone ()),((Vector) rlineVector.clone()),streamVector.indexOf(outputStream)));
        System.out.println("发送LoginMessage消息");
        outputStream.flush ();
      }
      handleMessage (inputStream);
    } finally {
      streamVector.removeElement (outputStream);
    }
  }
  //处理各种消息
  void handleMessage (ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
    while (true) {
     Object message = inputStream.readObject();
     if( message instanceof IMessage){
       //处理所有对基本图形的操作的消息
    	 message = (IMessage)message;     
     if (message instanceof ClientAddObjMsg) {
    	 //如果接收到客户端添加基本图形消息
        Object obj = ((ClientAddObjMsg) message).getObj();
        synchronized (streamVector){
        	//将添加对象加入到白板已有对象的类中
          Object id = paintedObjects.add(obj);
          //通知所有客户添加图形对象
          notifyAll(new ServerAddObjMessage(id, obj));
        }
      } else if (message instanceof ClientReplaceObjMsg) {
    	 //如果接收到客户端移动图形的消息
        Object oldID = ((ClientReplaceObjMsg) message).getId();
        if(oldID != null){
        //将原来位置的对象提取出
        Object element = ((ClientReplaceObjMsg) message).getElement();
        synchronized (paintedObjects) {
        //将原来位置的图形对象加入到需要被删除的列表中
          Object id = paintedObjects.replaceObject (oldID, element);
           if (id != null){
        	    //通知所有客户端更新本地白板
             notifyAll (new ServerReplacedMessage(oldID, id, element));
           }
        }
       }
      } else if(message instanceof ClientQuitMsg){
    	  //如果接收到用户退出的消息
        System.out.println("收到退出消息.....");
        return ;
      }
      else {
        System.out.println ("Unknown message: " + message);
      }
     }else if(message instanceof ClientAddRanLineMsg){
    	 //如果接收到用户添加随机曲线的消息
    	 //将点对信息加入的需要添加的图形对象列表
     rlineVector.addElement(((ClientAddRanLineMsg)message).getLine());
     //通知所有客户端更新本地白板
     NotifyRanLine((ClientAddRanLineMsg)message);}
    }
  }

  static void addOutputStream (ObjectOutputStream out) {
    streamVector.addElement (out);
  }

  static void rmvOutputStream (ObjectOutputStream out) {
    streamVector.removeElement (out);
  }
  //通知所有客户端添加随机曲线
  static void NotifyRanLine(ClientAddRanLineMsg message){
    System.out.println ("Broadcast addRandomLineMsg to " + streamVector.size () + " recipients.");
   for (int i = 0; i < streamVector.size (); ++ i) {
     ObjectOutputStream out = (ObjectOutputStream) streamVector.elementAt (i);
      try{
       out.writeObject (message);
       out.flush ();
      }catch(Exception ex){
    	  ex.printStackTrace();
      System.err.println("发送ClientAddRanLineMsg消息失败!");}
    }
  }
  //通知所有客户端对基本图形进行更新
  static void notifyAll(IMessage message) {
    System.out.println ("Broadcast " + message.getClass ().getName () + " to " + streamVector.size () + " recipients.");
    for (int i = 0; i < streamVector.size (); ++ i) {
      ObjectOutputStream out = (ObjectOutputStream) streamVector.elementAt (i);
       try{
        out.writeObject (message);
        out.flush ();
       }catch(Exception ex){
       System.out.println("failed to send message");}
    }
  }

 public static void main (String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket (port);
    System.out.println("服务器监听端口:1234.....");
    while (true) {
      try {
        WhiteBoardServer wbServer = new WhiteBoardServer(serverSocket.accept ());
        wbServer.start ();
      } catch (IOException ex) {
        ex.printStackTrace ();
      }
    }
  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -