📄 whiteboardserver.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 + -