专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » 用JAVA编制Internet电子白板软件Software »正文

用JAVA编制Internet电子白板软件Software

来源: 发布时间:星期四, 2008年12月18日 浏览:2次 评论:0
前言   随着Internet迅速发展,在Email、WWW、FTP等传统非实时应用日趋成熟同时广大网络用户对在线实时交流需求不断扩大如网上会议、远程教学、协同工作等这方面应用软件Software也日益丰富起来该类软件Software主要分为两类种是以目前BBS和主页上聊天室为代表纯文字型交流工具;另种就是本文要介绍电子白板类交流工具电子白板除了具备聊天室全部功能外更重要它还引入了绘画图形交流功能使网上交流形象性和直观性大大加强了弥补了文字交流不足当分布在Internet区别位置用户用白板进行交流时个人在自己白板上绘制图形可以马上在别人白板上显示出来好象大家都在同块白板上绘画彼此间距离感大大缩短了   目前具有电子白板功能软件Software有微软Netmeeting等此类软件Software在使用前需要用安装盘安装(Netmeeting是Internet Explorer 4.0选装件)在设置完成后才能使用相比而言在主页中用Java Applet实现白板功能就显得优势很大它不需要传统软件Software下载、安装和设置繁琐步骤只要用支持JAVA浏览器连接到该Applet所在主页就可以使用白板用于浏览器普及性(大部分常用浏览器都支持JAVA如InternetExploer3.0和Netscape Navigator 3.0及以上版本)使得这种电子白板潜在客户群是巨大此外用JAVA编制电子白板软件Software还有个显而易见优势就是整个软件Software(尤其是白板服务器)无须重新修改编译就可在NT、Unix、Linux等支持JAVA平台上运行   目前基于浏览器和JAVA电子白板正处于起步阶段笔者尚未在网上看到该类软件Software由于工作需要笔者自行开发了套此类电子白板软件Software这里想将开发中些经验介绍给大家以达到共同交流 工作原理   电子白板有两种实现模型种是无白板服务器因此仅支持两个用户直接连结;另种是有白板服务器原则上不限制同时上线人数和交谈室个数具体实现上可视服务器性能和需要而定本文要介绍属于后者   当用户需用白板和他人交流时需要先用浏览器连到Applet所在主页Applet运行后会连接到该白板服务器和服务器建立TCP连接每个用户可以在自己白板上(嵌在Applet画面中)绘制图形和输入文字Applet会将这些信息通过已建立网络连接发往白板服务器并不断侦听、接收来自白板服务器图形和文字信息将其再现在用户白板中白板服务器作用是不断侦听、接收来自各Applet信息并将其转发给其他用户   由于浏览器对Java Applet限制使得Applet只能访问发送该Applet宿主主机因此只能在该Applet所在主机上运行白板服务器使得Applet能建立和远程白板服务器联系 功能设计   个实用电子白板系统应该具备以下基本功能: 用户在浏览到白板主页时需登录后才能进行交流这将提供交流时用名字必要时还可做权限检查 用户能够根据交谈室交谈主题选择参加和退出现有交谈室并且能建立新交谈室可以根据该电子白板系统应用领域和需要附加些权限设置 用户只能和在同交谈室中用户交流个交谈室信息对于别交谈室是不可见 白板应至少具有些如更换画笔颜色、清除画板(仅影响自己白板)等方便用户功能 白板应具有个操作提示和操作信息反馈栏对用户显示些操作提示和操作结果信息这样可以方便用户使用 用户应能暂停和恢复自己白板工作   为了增加白板实用价值可以考虑增加如和windows画笔工具类似画正方形、圆形等类似功能本例作为电子白板基本模型建立故没有加入这些功能实际上只要了解了下面要介绍白板通讯协议集设计原则增加以上功能是非常容易 通讯协议集制定   由于JAVA内置标准基础通讯协议是TCP/IP所以我们只需在其基础上建立电子白板应用层协议集协议集模型将采用服务器/客户机请求/应答模式可以根据需要实现白板功能制定通讯协议集协议集中包括登录、图形传输(分服务器发出和客户机发出两部分)、文字传输(分服务器发出和客户机发出两部分)、服务器要求刷新交谈室及成员名单、客户机要求刷新交谈室及成员名单、加入指定交谈室、退出交谈室、建立新交谈室、暂停/恢复交流等部分   由于已经依靠TCP/IP协议保证数据传输正确性所以在这个电子白板通讯协议集设计中应在保证功能前提下尽量简洁来提高带宽利用率白板通讯协议集细节可参考如下:   注意:   (S)表示该部分由服务器发出客户机接收;   (C)表示该部分由客户机发出服务器接收;   数据格式表示:引号的间表示()表示短整形数(2字节)()表示标准整形数(4字节) 登录(C):"log"→用户名 图形传输(客户机发出)(C):"draw"→()颜色值→()直线起点横坐标→()直线起点纵坐标→()直线终点横坐标→()直线终点纵坐标 图形传输(服务器发出)(S):"draw"→()颜色值→()直线起点横坐标→()直线起点纵坐标→()直线终点横坐标→()直线终点纵坐标 文字传输(客户机发出)(C):"text"→用户在白板对话框中输入文字 文字传输(服务器发出)(S):"text"→文字输入者姓名串→该用户输入文字 服务器要求刷新交谈室及成员名单(S):"refresh"→交谈室1主题串→交谈室1中用户1姓名串→交谈室1中用户2姓名串→...→"complete"→交谈室2主题串→交谈室2中用户1姓名串→交谈室2中用户2姓名串→...→"complete"→...→最后个交谈室主题串→最后个交谈室中用户1姓名串→最后个交谈室中用户2姓名串→...→"complete"→"ok" 客户机要求刷新交谈室及成员名单(C):"refresh"(服务器收到此命令会执行前面服务器要求刷新交谈室及成员名单子协议以响应客户机请求) 加入指定交谈室(C):"join"→申请加入交谈室主题 退出交谈室(C):"quit" 建立新交谈室(C):""→申请建立新交谈室主题(服务器收到此命令会自动在该用户原来所在交谈室中注销并使该用户成为新交谈室员) 暂停交流(C):"pause" 恢复交流(C):"continue"   以上为本电子白板软件Software所遵循通讯协议集这个协议集可扩充性很强可以随时按增加功能扩充协议集例如需要传送圆形图案则可将如下协议加到协议集中:"circle"→()颜色值→()圆心横坐标→()圆心纵坐标→()圆半径 编程实现   设计分服务器JAVA Application和客户端Java Applet两部分进行   编程中需要注意以下几点: 服务器不要采用客户端接入时建立用户线程退出交谈室时销毁线程工作流程有些操作系统线程操作机制不够健全在线程销毁时线程所占资源不能被完全释放以致于在白板服务器运行过程中将逐渐消耗掉系统资源所以应在服务器化时按照最大允许同时上线用户数建立所有用户服务线程这些线程将等待客户端接入当用户退出交谈室时线程并不销毁而是清除用户数据重新进入等待接入状态准备为下个用户服务这样就保证了白板服务器可以长期可靠运行 当用户在白板上连续绘画时可能产生大量图形数据客户端Applet若在白板AWT事件处理中完成将这些数据传输给服务器任务则很有可能由于网络I/O瓶颈作用使得AWT事件处理线程受阻从而影响白板Applet、浏览器、其他正在运行应用软件Software界面相应性解决办法就是使Applet再建立个后台绘图数据传输线程白板AWT事件处理将用户绘图数据通过管道流(PipedStream)传输给这个线程后就返回把网络传输任务留给这个线程进行 在服务器和客户端Applet中协议集每个子协议实现都要分别建立个同步块(synchronize)该子协议全部操作都要在这个同步块内完成以限制自由访问网络接插建立输入流和输出流使得当个线程执行个子协议时能够独占这些网络资源而使别线程不能访问这些资源以保证线程能够完整正确地执行子协议但是由于同步操作会降低线程调度和执行效率所以要在确保子协议完整执行前提下尽量缩小同步代码块范围 由于协议集中数据类型既有串又有整形数因此在中选用DataInputStream和DataOutputStream作为数据输入流和输出流此外由于UTF格式文本支持中文且在串中已包含长度信息可以方便数据读取故在本网络通信中串全部采用UTF格式设计自己白板可以根据需要换用其他文本格式和编码规则定要保证输入流和输出流采用是同种格式和编码 考虑到目前Netscape Navigator 3.0和Internet Explorer 3.0目前仍普遍使用而这两种浏览器JAVA虚拟机都不支持较新JDK1.1标准所以在本客户机Applet部分中没有使用JDK1.1特有类库   首先介绍服务器编制需确定主要几个类及其成员列表如下: ChatServer类:服务器启动类 ChatServer:建立服务器管理界面 initServer:建立服务器插结化交谈室数据按照允许同时上线最大用户数建立多个用户服务线程 go:启动用户服务线程 quit:中止用户服务线程关闭服务器插结并释放全部资源 User类:为Thread类子类实现用户服务线程处理服务器/客户机会话 run:等待客户端接入;客户端接入后化网络资源进入循环侦听客户端请求状态并根据客户端请求相应协议处理 sendText:按照文字传输子协议接收用户发出文字信息并转发给同交谈室其他用户 sendDraw:按照图形传输子协议接收用户发出图形信息并转发给同交谈室其他用户 commandCenter:为服务器接收到指令选择运行适当处理 server_ask_refresh:服务器主动刷新交谈室及成员名单 server_answer_reresh:响应客户机要求刷新交谈室及成员名单 server_answer_log:响应客户机登录 server_answer_join():响应用户加入指定交谈室请求 server_answer_pause():响应用户暂停交流请求 server_answer_continue:响应用户恢复交流请求 server_answer_Room():响应用户建立新交谈室请求 server_answer_quit():响应用户退出交谈室请求 server_ask_text():服务器向客户机转发文字信息 server_ask_draw():服务器向客户机转发图形信息 refreshToAll():服务器刷新所有在线客户端交谈室数据 refreshToAllNotMe():服务器刷新除该用户外所有在线客户端交谈室数据 Close:用户申请退出时关闭网络插结释放线程占用网络资源 RoomGroup类:保存所有交谈室数据直接处理和交谈室有关操作 Room():建立新交谈室 join():加入指定交谈室 quit():退出指定交谈室 getUsersName():返回指定交谈室内用户名 getRoomID():按照交谈室主题查询并返回交谈室ID号 Room类:保存并处理本交谈室用户数据 join():加入本交谈室 quit():退出本交谈室 getUsersName():返回本交谈室用户名 DataBag类:包装图形和文字数据 AboutDialog类:生成About对话框可显示版权信息 QuitDialog类:生成QuitDialog对话框用于确认是否结束服务器运行   客户机Applet包含类及其主要成员如下: ChatApplet类:为Applet类子类实现Runnable接口是白板Applet核心类完成和用户交流和和服务器通讯任务 init:化Applet用户界面 run::循环侦听来自白板服务器信息commandCenter命令处理 start:生成并启动Applet线程 stop:中止Applet线程 destroy():中止后台图形数据传送线程关闭网络资源 Close:关闭所有打开网络插结和通讯流 openSocket():建立网络插结和通讯流 commandCenter():集中处理来自用户和服务器以及来自Applet内部命令相应处理 client_ask_refresh():客户机请求刷新交谈室数据 client_answer_refresh():客户机接收服务器发送交谈室数据 client_ask_log():申请登录到服务器 client_ask_join():申请加入指定交谈室 client_ask_pause():暂停交流 client_ask_continue():恢复交流 client_ask_Room():申请建立新交谈室 client_ask_quit():退出交谈室 client_ask_text():发送用户输入文字信息 client_answer_text():接收服务器转发其他用户文字信息 client_answer_draw():接收服务器转发其他用户图形信息 refreshRoomList():显示交谈室列表 refreshUserList():显示指定交谈室中用户列表 prChat_Area():将该用户和来自服务器其他用户输入文字用指定格式显示在Applet交谈文本框中 sendText():判断用户输入文字是否为有效若有效则发送文字 drawBoard_Canvas():按DataBag对象在Applet白板上绘图 boardCanvas_MouseDrag():当鼠标在白板上拖动时将鼠标轨迹包装成数据包发送给后台网络传输线程 logButton_Clicked():当用户单击Applet登录钮时建立网络插结和后台网络传输线程 其他系列用户界面事件处理:和用户交流接收用户输入直接处理或commanCenter执行用户命令 RoomData类:存储该交谈室主题和用户名数据类 addUser():在该交谈室中添加用户名 removeUser():在该交谈室中删除用户名 getUsersName():返回所有在该交谈室中用户名 Rooms类:为Vector类子类存储所有交谈室用户数据 getRoomByName():按交谈室主题返回指定交谈室RoomData对象 addElement():添加RoomData对象 SendDrawData类:为Thread类子类实现后台网络传输线程 run():循环侦听来自Applet主线程图形信息并将其通过网络接插生成输出流发送给服务器 quit():关闭该线程和Applet主线程连接流 Logo类:为Canvas类子类用于在Applet中显示图标或版权信息   此外中还定义了几个异常类可以方便异常处理机制设计增加可维护性和可读性Applet徽标默认图形文件名是"cdownlogo.jpg"(457×60)服务器像标默认图形文件名是"icon.g"(19×17)服务器默认占用端口号为10000以上各项可以视需要修改 结论   本文结合笔者编程经验初步介绍了基于浏览器和JAVA电子白板软件Software设计过程希望这些内容能够对广大软件Software开发人员有所帮助欢迎大家和笔者联系([email protected])就电子白板些问题进行切磋和交流 附录内容: 本电子白板系统完整源已测试通过可以直接编译运行 嵌入Applet主页示范请注意主页中Applet参数设置 本电子白板客户端Applet用户界面及操作思路方法介绍 附录1:源: import java.net.*; import java.io.*; import java.awt.*; import java.util.*; import java.applet.*; // 1:server 服务器启动类 public ChatServer extends Frame { final DEFAULT_USERCOUNT=30; final DEFAULT_PORT=10000; final String ICON_FILE="icon.g"; num_Line=0; User users=null; ServerSocket ss=null; RoomGroup roomGroup=null; port=DEFAULT_PORT; Image icon=null; java.awt.TextArea message_TextArea; java.awt.List users_List; java.awt.Choice room_Choice; java.awt.Label message_Label; java.awt.Label room_Label; java.awt.Label userList_Label; java.awt.Button clean_Button; java.awt.MenuBar MenuBar; java.awt.Menu menu1; java.awt.Menu menu3; void initServer( port) throws IOException { users= User[ChatServer.DEFAULT_USERCOUNT]; roomGroup= RoomGroup(ChatServer.DEFAULT_USERCOUNT,room_Choice, this); try{ ss= ServerSocket(port,5); message_TextArea.appendText("\nserver init successed"); }catch(Exception e){ .out.prln(e); message_TextArea.appendText("\nserver init error"+e); } for( i=0;i< users.length;i) { users[i]= User(this,i); } roomGroup.Users(users); show; go; message_TextArea.appendText("\nserver started"); } ChatServer( port) throws IOException { icon=getToolkit.getImage(ICON_FILE); MediaTracker tracker = MediaTracker(this); tracker.addImage(icon,0); try{ tracker.waitForAll; }catch(Exception e){ .out.prln(e); } //{{INIT_CONTROLS Layout(null); addNoty; resize(ins.left + ins.right + 544, ins.top + ins.bottom + 355); //$$ openFileDialog1.move(36,276); Title("Chat & WhiteBoard Server 1.0"); IconImage(icon); //}} message_TextArea = java.awt.TextArea; message_TextArea.reshape(ins.left + 12, ins.top + 36,396,240); add(message_TextArea); users_List = java.awt.List(5,false); add(users_List); users_List.reshape(ins.left + 432, ins.top + 144,76,110); room_Choice = java.awt.Choice; add(room_Choice); room_Choice.reshape(ins.left + 420, ins.top + 60,100,1); message_Label = java.awt.Label("message"); message_Label.reshape(ins.left + 36, ins.top + 12,100,24); add(message_Label); room_Label = java.awt.Label("Chat room"); room_Label.reshape(ins.left + 420, ins.top + 14,100,24); add(room_Label); userList_Label = java.awt.Label("user List"); userList_Label.reshape(ins.left + 420, ins.top + 108,100,28); add(userList_Label); clean_Button = java.awt.Button("clean"); clean_Button.reshape(ins.left + 180, ins.top + 12,60,24); add(clean_Button); //{{INIT_MENUS MenuBar = java.awt.MenuBar; menu1 = java.awt.Menu("File"); menu1.add("Restart"); menu1.add("Exit"); MenuBar.add(menu1); menu3 = java.awt.Menu("Help"); MenuBar.HelpMenu(menu3); menu3.add("About"); MenuBar.add(menu3); MenuBar(MenuBar); //$$ MenuBar.move(4,277); this.port=port; initServer(port); }// constructor 1 ended ChatServer throws IOException{ this(ChatServer.DEFAULT_PORT); }// contructor 2 ended void cleanButton_Clicked(Event event) { //{{CONNECTION // Hide the Frame message_TextArea.Text(""); //}} } void About_Action(Event event) { //{{CONNECTION // Action from About Create and show as modal ( AboutDialog(this, true)).show; //}} } void Exit_Action(Event event) { //{{CONNECTION // Action from Exit Create and show as modal ( QuitDialog(this, true)).show; //}} } void Restart_Action(Event e) { try{ quit; initServer(port); }catch(Exception e1){ message_TextArea.appendText("\ninit server error"); } } public synchronized void show { move(50, 50); super.show; } void roomChoice_Action(Event e) { String roomName=null; roomID=0; users_List.clear; roomName=room_Choice.getSelectedItem; roomID=roomGroup.getRoomID(roomName); for( i=0;i< users.length;i) { ((users[i].logged)&&(users[i].belongRoom) &&(users[i].roomIDroomID)) { users_List.addItem(users[i].name); } } } public boolean handleEvent(Event event) { (event.id Event.WINDOW_DESTROY) { quit; hide; // hide the Frame dispose; // free the system resources .exit(0); // close the application true; } (event.target room_Choice && event.id Event.ACTION_EVENT) { roomChoice_Action(event); true; } (event.target clean_Button && event.id Event.ACTION_EVENT) { cleanButton_Clicked(event); true; } super.handleEvent(event); } public boolean action(Event event, Object arg) { (event.target instanceof MenuItem) { String label = (String) arg; (label.equalsIgnoreCase("About")) { About_Action(event); true; } (label.equalsIgnoreCase("Exit")) { Exit_Action(event); true; } (label.equalsIgnoreCase("Restart")) { Restart_Action(event); true; } } super.action(event, arg); } public void (String args) { try{ ChatServer chatServer= ChatServer; }catch(Exception e){ .out.prln(e); } } public void go { for( i=0;i< users.length;i) { users[i].start; } }// method 'go' ended public void quit { for( i=0;i< users.length;i) { (users[i]!=null) users[i].destroy; } try{ ss.close; ss=null; room_Choice.removeAll; users_List.clear; message_TextArea.appendText("\nserver closed"); }catch(IOException e){ .out.prln(e); } }// method 'quit' ended } // 'ChatServer' ended // 2:RoomGroup服务器用交谈室数据类 RoomGroup { Room rooms=null; final String DEFAULT_ROOM_SUBJECT="默认"; final DEFAULT_ROOM_ID=0; Choice room_Choice=null; List users_List=null; User users=null; ChatServer chatServer=null; RoomGroup( roomCount,Choice room_Choice, ChatServer chatServer) { this.chatServer=chatServer; this.room_Choice=room_Choice; this.users=users; this.users_List=users_List; rooms= Room[roomCount]; try{ Room(DEFAULT_ROOM_SUBJECT); }catch(Exception e){ .out.prln(e); } }// contructor 1 ended void Users(User users) { this.users=users; } void refreshList { chatServer.handleEvent( Event(this, Event.ACTION_EVENT, null)); } public getRoomID(String roomName){ for( i=0;i< rooms.length;i) { ((rooms[i]!=null)&&(rooms[i].getRoomName.equals(roomName))) { i; } } 0; }// method 'getRoomID' ended public Room(String subject) throws TooManyRoomsException { i=0; while((i< rooms.length)&&(rooms[i]!=null)) { i; } (i< rooms.length) { rooms[i]= Room(subject,i); room_Choice.addItem(subject); room_Choice.repa; i; } { throw TooManyRoomsException; } } // method 'Room' ended public void join( roomID,User user) throws NoSuchRoomException { try{ rooms[roomID].join(user); room_Choice.select(getRoomName(roomID)); refreshList; }catch(ArrayIndexOutOfBoundsException e){ throw NoSuchRoomException; }catch(NullPoerException e) { throw NoSuchRoomException; } } // method 'join' ended public void quit( roomID,User user) throws NoSuchRoomException { try{ try{ rooms[roomID].quit(user); room_Choice.select(getRoomName(roomID)); refreshList; }catch(NotMemberException e){ }finally{ ((rooms[roomID].getUserCount0)&& (roomID!=DEFAULT_ROOM_ID)) { room_Choice.remove(rooms[roomID].getRoomName); rooms[roomID]=null; } } }catch(ArrayIndexOutOfBoundsException e){ throw NoSuchRoomException; }catch(NullPoerException e) { throw NoSuchRoomException; } } // method 'quit' ended public String getUsersName( roomID) throws NoSuchRoomException { try{ (rooms[roomID]!=null) rooms[roomID].getUsersName; null; }catch(ArrayIndexOutOfBoundsException e) { throw NoSuchRoomException; } } // method 'getUsersName' ended public getUserCount( roomID) throws NoSuchRoomException { try{ rooms[roomID].getUserCount; }catch(ArrayIndexOutOfBoundsException e) { throw NoSuchRoomException; }catch(NullPoerException e) { throw NoSuchRoomException; } } // method 'getUserCount' ended public String getRoomName( roomID) throws NoSuchRoomException { try{ rooms[roomID].getRoomName; }catch(ArrayIndexOutOfBoundsException e) { throw NoSuchRoomException; }catch(NullPoerException e) { throw NoSuchRoomException; } } // method 'getRoomName' ended public boolean isActive( roomID) throws NoSuchRoomException { try{ (rooms[roomID]!=null) true; false; }catch(ArrayIndexOutOfBoundsException e) { throw NoSuchRoomException; } }//method 'isActive' ended public roomCount { rooms.length; } //method 'roomCount' ended } // 'RoomGroup' ended // 3:'Room'RoomGroup引用数据类 Room { String subject=null; ID=0; Vector users=null; Room(String s, ID) { subject=s; this.ID=ID; users= Vector(10,5); }// constructor 1 ended public void join(User user) { users.addElement(user); user.roomID=ID; user.paused=false; }// method 'join' ended public void quit(User user) throws NotMemberException { (users.contains(user)) { users.removeElement(user); } throw NotMemberException; }// method 'quit' ended public String getUsersName { String usersName=null; (users.size!=0) { usersName= String[users.size]; for( i=0;i< usersName.length;i) { usersName[i]=((User)(users.elementAt(i))).name; } usersName; } { null; } } // method 'getUsersName' ended public String getRoomName { subject; }// method 'getRoomName' ended public getUserCount { users.size; }// method 'getUserCount' ended } // 'Room' ended // 4:'User'服务器引用用户服务线程类 User extends Thread { String name=null; ID=0; boolean paused=false; boolean used=false; boolean belongRoom=false; boolean logged=false; DataInputStream io_in=null; DataOutputStream io_out=null; roomID=0; ServerSocket ss=null; Socket s=null; User users=null; RoomGroup roomGroup=null; TextArea message_TextArea=null; ChatServer chatServer=null; User(ChatServer chatServer, ID) { this.message_TextArea=chatServer.message_TextArea; this.ss=chatServer.ss; this.users=chatServer.users; this.roomGroup=chatServer.roomGroup; this.ID=ID; this.chatServer=chatServer; }// CONSTRATOR 1 ended public void run { used=false; try{ while(true){ String message=null; s=ss.accept; message_TextArea.appendText("\nChannel "+ID+" opened"); io_in= DataInputStream(s.getInputStream); io_out= DataOutputStream(s.getOutputStream); used=true; logged=false; try{ while(used) { message=io_in.readUTF; message_TextArea.appendText("\nChannel"+ID+"("+ name+"):receive:"+message); chatServer.num_Line; (chatServer.num_Line >150) { message_TextArea.Text(""); chatServer.num_Line=0; } (message.equals("text")) sendText; (message.equals("draw")) sendDraw; { commandCenter(message, DataBag("none","none",0,0,0,0,0)); ((message.equals(""))|(message.equals("join"))) refreshToAll; (message.equals("quit")) refreshToAllNotMe; } } }catch(PleaseCloseSocketException e) { }catch(IOException e){ }finally { try{ roomGroup.quit(roomID,this); refreshToAllNotMe; }catch(Exception e){} Close; used=false; logged=false; } } }catch(IOException e){ .out.prln(e); } }// method 'run' ended public void destroy { Close; this.stop; }// method 'destroy' ended public void Close { try{ io_in.close; io_in=null; }catch(Exception e){} try{ io_out.flush; io_out.close; io_out=null; }catch(Exception e){} try{ s.close; s=null; }catch(Exception e){} }// method 'Close' ended public void sendText throws PleaseCloseSocketException { String message=null; DataBag data=null; try{ synchronized (this){ message=io_in.readUTF; } data= DataBag(name,message,0,0,0,0,0); for( i=0;i< users.length;i) { ((users[i].logged)&&(users[i].ID!=ID)&& (!users[i].paused)&&(users[i].roomIDroomID)) users[i].commandCenter("server_ask_text",data); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'sendText' ended public void sendDraw throws PleaseCloseSocketException { String message=null; color=0,x0=0,y0=0,x1=0,y1=0; DataBag data=null; try{ synchronized (this) { color=io_in.readInt; x0=io_in.readShort; y0=io_in.readShort; x1=io_in.readShort; y1=io_in.readShort; } data= DataBag("none","none",color,x0,y0,x1,y1); for( i=0;i< users.length;i) { ((users[i].logged)&&(users[i].ID!=ID) &&(!users[i].paused)&&(users[i].roomIDroomID)) users[i].commandCenter("server_ask_draw",data); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'sendDraw' ended public void refreshToAll throws PleaseCloseSocketException { for( i=0;i< users.length;i) { (users[i].logged) users[i].commandCenter("server_ask_refresh", DataBag("none","none",0,0,0,0,0)); } }// method "refreshToAll" ended public void refreshToAllNotMe throws PleaseCloseSocketException { for( i=0;i< users.length;i) { ((users[i].logged)&&(users[i].ID!=ID)) users[i].commandCenter("server_ask_refresh", DataBag("none","none",0,0,0,0,0)); } }// method "refreshToAll" ended public void commandCenter(String command, DataBag data) throws PleaseCloseSocketException { (command.equals("server_ask_refresh")) server_ask_refresh; (command.equals("refresh")) server_answer_refresh; (command.equals("log")) server_answer_log; (command.equals("join")) server_answer_join; (command.equals("pause")) server_answer_pause; (command.equals("continue")) server_answer_continue; (command.equals("")) server_answer_Room; (command.equals("quit")) server_answer_quit; (command.equals("server_ask_text")) server_ask_text(data); (command.equals("server_ask_draw")) server_ask_draw(data); }// method commandCenter ended private void server_ask_draw(DataBag data) throws PleaseCloseSocketException { String message=null; try{ synchronized (this){ io_out.writeUTF("draw"); io_out.writeInt(data.color); io_out.writeShort(data.x0); io_out.writeShort(data.y0); io_out.writeShort(data.x1); io_out.writeShort(data.y1); } message_TextArea.appendText("\nChannel"+ID+"("+ name+"):send:"+"draw data"); }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'server_ask_draw' ended private void server_ask_text(DataBag data) throws PleaseCloseSocketException { String message=null; try{ synchronized (this){ io_out.writeUTF("text"); io_out.writeUTF(data.name); io_out.writeUTF(data.message); } message_TextArea.appendText("\nChannel"+ID+"("+ name+"):send:"+"text :"+data.message); }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'server_ask_text' ended private void server_ask_refresh throws PleaseCloseSocketException { String message=null; try{ synchronized (this){ io_out.writeUTF("refresh"); for( i=0;i< roomGroup.roomCount;i) { (roomGroup.isActive(i)) { io_out.writeUTF(roomGroup.getRoomName(i)); String names=roomGroup.getUsersName(i); (names!=null) for( j=0;j< names.length;j) { io_out.writeUTF(names[j]); } io_out.writeUTF("complete"); } } io_out.writeUTF("ok"); io_out.writeUTF(roomGroup.getRoomName(roomID)); } message_TextArea.appendText("\nChannel"+ID+"("+ name+"):send:"+"refresh data"); }catch(IOException e){ throw PleaseCloseSocketException; }catch(NoSuchRoomException e){} }// method 'server_ask_refresh' ended private void server_answer_refresh throws PleaseCloseSocketException { String message=null; commandCenter("server_ask_refresh", DataBag("none","none",0,0,0,0,0)); }// method 'server_answer_refresh' ended private void server_answer_log throws PleaseCloseSocketException { String message=null; try{ name=io_in.readUTF; logged=true; belongRoom=false; message_TextArea.appendText("\nChannel"+ID+"("+ name+"):logged"); }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'server_answer_log' ended private void server_answer_join throws PleaseCloseSocketException { String message=null; roomID=0; try{ (belongRoom) { try{ roomGroup.quit(this.roomID,this); belongRoom=false; }catch(NoSuchRoomException e){} } roomID=roomGroup.getRoomID(io_in.readUTF); paused=false; try{ roomGroup.join(roomID,this); belongRoom=true; paused=false; this.roomID=roomID; message_TextArea.appendText("\nChannel"+ID+"("+ name+"):join room("+roomGroup.getRoomName(roomID) +")"); }catch(NoSuchRoomException e){} }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'server_answer_join' ended private void server_answer_pause throws PleaseCloseSocketException { String message=null; paused=true; message_TextArea.appendText("\nChannel"+ID+"("+ name+"):paused"); }// method 'server_answer_pause' ended private void server_answer_continue throws PleaseCloseSocketException { String message=null; paused=false; message_TextArea.appendText("\nChannel"+ID+"("+ name+"):continued"); }// method 'server_answer_continue' ended private void server_answer_Room throws PleaseCloseSocketException { String message=null; roomID=0; try{ (belongRoom) { roomGroup.quit(this.roomID,this); belongRoom=false; } message=io_in.readUTF; try{ roomID=roomGroup.Room(message); belongRoom=false; paused=false; roomGroup.join(roomID,this); belongRoom=true; this.roomID=roomID; message_TextArea.appendText("\nChannel"+ID+"("+ name+"): room("+message+")"); }catch(TooManyRoomsException e){ } }catch(IOException e){ throw PleaseCloseSocketException; }catch(NoSuchRoomException e){} }// method 'server_answer_' ended private void server_answer_quit throws PleaseCloseSocketException { String message=null; try{ try{ roomGroup.quit(roomID,this); used=false; logged=false; belongRoom=false; roomID=0; name=null; message_TextArea.appendText("\nChannel"+ID+"("+ name+"):quited"); }catch(NoSuchRoomException e){ io_out.writeUTF("fail"); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'server_answer_quit' ended }// 'user' ended /* A basic extension of the java.awt.Dialog */ // 5:QuitDialg服务器退出对话框 public QuitDialog extends Dialog { void yesButton_Clicked(Event event) { getParent.handleEvent( Event(this, Event.WINDOW_DESTROY, null)); } void noButton_Clicked(Event event) { //{{CONNECTION // Clicked from noButton Hide the Dialog hide; //}} } public QuitDialog(Frame parent, boolean modal) { super(parent, modal); //IconImage(icon); //{{INIT_CONTROLS Layout(null); addNoty; resize(ins.left + ins.right + 337, ins.top + ins.bottom + 135); yesButton = java.awt.Button(" Yes "); yesButton.reshape(ins.left + 72, ins.top + 84,79,22); yesButton.Font( Font("Dialog", Font.BOLD, 12)); add(yesButton); noButton = java.awt.Button(" No "); noButton.reshape(ins.left + 180, ins.top + 84,79,22); noButton.Font( Font("Dialog", Font.BOLD, 12)); add(noButton); label1 = java.awt.Label("Do you really want to quit?"); label1.reshape(ins.left + 84,ins.top + 36,180,23); add(label1); Title("Chat&WhiteBoard Server 1.0 - Quit"); Resizable(false); //}} } public QuitDialog(Frame parent, String title, boolean modal) { this(parent, modal); Title(title); } public synchronized void show { Rectangle bounds = getParent.bounds; Rectangle abounds = bounds; move(bounds.x + (bounds.width - abounds.width)/ 2, bounds.y + (bounds.height - abounds.height)/2); super.show; } public boolean handleEvent(Event event) { (event.id Event.WINDOW_DESTROY) { hide; true; } (event.target noButton && event.id Event.ACTION_EVENT) { noButton_Clicked(event); } (event.target yesButton && event.id Event.ACTION_EVENT) { yesButton_Clicked(event); } super.handleEvent(event); } //{{DECLARE_CONTROLS java.awt.Button yesButton; java.awt.Button noButton; java.awt.Label label1; //}} } /* A basic extension of the java.awt.Dialog */ // 6:"AboutDialog"服务器"有关"对话框 public AboutDialog extends Dialog { void okButton_Clicked(Event event) { //{{CONNECTION // Clicked from okButton Hide the Dialog hide; //}} } public AboutDialog(Frame parent, boolean modal) { super(parent, modal); //IconImage(icon); //{{INIT_CONTROLS Layout(null); addNoty; resize(ins.left + ins.right + 249, ins.top + ins.bottom + 170); label1 = java.awt.Label("Chat&WhiteBoard Server 1.0",Label.CENTER); label1.reshape(ins.left + 36, ins.top + 12,166,21); add(label1); label2 = java.awt.Label("清华大学汽车工程系",Label.CENTER); label2.reshape(ins.left + 36,ins.top + 36,168,24); add(label2); okButton = java.awt.Button("OK"); okButton.reshape(ins.left + 96,ins.top + 132,66,27); add(okButton); label3 = java.awt.Label("学生科学技术协会制作",Label.CENTER); label3.reshape(ins.left + 36,ins.top + 60,168,24); add(label3); label4 = java.awt.Label("(c)版权所有",Label.CENTER); label4.reshape(ins.left + 24,ins.top + 84,192,24); add(label4); label5 = java.awt.Label("1998年8月",Label.CENTER); label5.reshape(ins.left + 72,ins.top + 108,96,24); add(label5); Title("About"); Resizable(false); //}} } public AboutDialog(Frame parent, String title, boolean modal) { this(parent, modal); Title(title); } public synchronized void show { Rectangle bounds = getParent.bounds; Rectangle abounds = bounds; move(bounds.x + (bounds.width - abounds.width)/ 2, bounds.y + (bounds.height - abounds.height)/2); super.show; } public boolean handleEvent(Event event) { (event.id Event.WINDOW_DESTROY) { hide; true; } (event.target okButton && event.id Event.ACTION_EVENT) { okButton_Clicked(event); } super.handleEvent(event); } //{{DECLARE_CONTROLS java.awt.Label label1; java.awt.Label label2; java.awt.Button okButton; java.awt.Label label3; java.awt.Label label4; java.awt.Label label5; //}} } /* A basic extension of the java.applet.Applet */ // 7:ChatApplet电子白板客户端Applet核心类 public ChatApplet extends Applet implements Runnable { volatile boolean logged=false; volatile boolean belongRoom=false; volatile boolean paused=false; volatile boolean roomDataValid=false; URL url=null; port=0; Socket s=null; Color currentColor=null; x0=0,y0=0,x1=0,y1=0; String userName=null; String roomName=null; roomID=0; Rooms rooms=null; Thread thread=null; DataInputStream io_in=null; DataOutputStream io_out=null; DataOutputStream piped_out=null; SendDrawData sender=null; logo_x=0,logo_y=0,logo_width=0,logo_height=0; public void start { (threadnull) { thread= Thread(this); thread.start; } } // method 'start' ended public void stop { (thread!=null) { quitButton_Clicked( Event(this,0,null)); message_TextArea.Text(""); thread.stop; thread=null; } } //method 'stop' ended public void destroy { try{ commandCenter("ask_quit", DataBag("none","none",0,0,0,0,0)); (sender!=null) { sender.quit; sender=null; } Close; }catch(Exception e){ .out.prln(e); } } //method 'destroy' close public void Close { try{ piped_out.flush; piped_out.close; piped_out=null; }catch(IOException e){ .out.prln(e); } try{ io_in.close; io_in=null; }catch(Exception e){} try{ io_out.flush; io_out.close; io_out=null; }catch(Exception e){} try{ s.close; s=null; }catch(Exception e){} } //method 'Close' ended public void commandCenter(String command, DataBag data) throws PleaseCloseSocketException { (command.equals("ask_refresh")) client_ask_refresh; (command.equals("refresh")) client_answer_refresh; (command.equals("ask_log")) client_ask_log; (command.equals("ask_join")) client_ask_join; (command.equals("ask_pause")) client_ask_pause; (command.equals("ask_continue")) client_ask_continue; (command.equals("ask_")) client_ask_Room; (command.equals("ask_quit")) client_ask_quit; (command.equals("ask_text")) client_ask_text(data); (command.equals("text")) client_answer_text; (command.equals("draw")) client_answer_draw; }// method commandCenter ended private void client_answer_text throws PleaseCloseSocketException{ String message=null; String name=null; DataBag data=null; try{ name=io_in.readUTF; message=io_in.readUTF; data= DataBag(name,message,0,0,0,0,0); prChat_Area(data); }catch(IOException e){ message_TextArea.appendText("抱歉无法正确接受句子"); throw PleaseCloseSocketException; } }//method 'client_answer_text' ended private void client_answer_draw throws PleaseCloseSocketException { DataBag data=null; color=0,x0=0,y0=0,x1=0,y1=0; try{ color=io_in.readInt; x0=io_in.readShort; y0=io_in.readShort; x1=io_in.readShort; y1=io_in.readShort; data= DataBag("none","none",color,x0,y0,x1,y1); drawBoard_Canvas(data); }catch(IOException e){ message_TextArea.appendText("抱歉无法正确接受图形"); throw PleaseCloseSocketException; } }//mwthod 'client_answer_draw' ended private void client_ask_text(DataBag data) throws PleaseCloseSocketException { String message=null; try{ synchronized(sender){ io_out.writeUTF("text"); io_out.writeUTF(data.message); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_text' ended private void client_ask_refresh throws PleaseCloseSocketException { try{ (sender!=null) { synchronized(sender){ io_out.writeUTF("refresh"); } }{ io_out.writeUTF("refresh"); } }catch(IOException e){ roomDataValid=false; throw PleaseCloseSocketException; } }// method 'client_ask_refresh' ended private void client_answer_refresh throws PleaseCloseSocketException { String message=null; RoomData roomData=null; roomID=0; rooms= Rooms(10,5); try{ while(!((message=io_in.readUTF).equals("ok"))) { roomData= RoomData(message); rooms.addElement(roomData); while(!(message=io_in.readUTF).equals("complete")) { roomData.addUser(message); } } message=io_in.readUTF; rooms.Default(message); roomDataValid=true; refreshRoomList; }catch(IOException e){ roomDataValid=false; message_TextArea.appendText("\n抱歉服务器无法请求刷新数据"); throw PleaseCloseSocketException; } }// method 'client_answer_refresh' ended private void client_ask_log throws PleaseCloseSocketException { String message=null; try{ synchronized(sender){ io_out.writeUTF("log"); io_out.writeUTF(userName); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_log' ended private void client_ask_join throws PleaseCloseSocketException { String message=null; ID=0; String subject=null; index=0; try{ subject=room_Choice.getSelectedItem; synchronized(sender){ io_out.writeUTF("join"); io_out.writeUTF(subject); } roomName=subject; }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_join' ended private void client_ask_pause throws PleaseCloseSocketException { String message=null; try{ synchronized(sender){ io_out.writeUTF("pause"); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_pause' ended private void client_ask_continue throws PleaseCloseSocketException { String message=null; try{ synchronized(sender){ io_out.writeUTF("continue"); } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_continue' ended private void client_ask_Room throws PleaseCloseSocketException { String message=null; String subject=null; roomID=0; RoomData roomData=null; try{ synchronized(sender){ io_out.writeUTF(""); subject=subject_TextField.getText; io_out.writeUTF(subject); } this.roomName=subject; }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_' ended private void client_ask_quit throws PleaseCloseSocketException { String message=null; index=0; try{ synchronized(sender){ io_out.writeUTF("quit"); } (sender!=null) { sender.quit; sender=null; } }catch(IOException e){ throw PleaseCloseSocketException; } }// method 'client_ask_quit' ended public void openSocket throws IOException { s= Socket(url.getHost,port); io_in= DataInputStream(s.getInputStream); io_out= DataOutputStream(s.getOutputStream); } // method openSocket ended public void run { String message=null; while(true) { try{ (s!=null) { commandCenter("ask_refresh", DataBag("none","none",0,0,0,0,0)); } while(logged){ message=io_in.readUTF; commandCenter(message, DataBag ("none","none",0,0,0,0,0)); } synchronized (this) { try{ wait; }catch(Exception w){ .out.prln(w); } } }catch(PleaseCloseSocketException e) { }catch(IOException e) {} } }// method 'run' ended public void addNewChoice { remove(room_Choice); room_Choice = java.awt.Choice; add(room_Choice); room_Choice.reshape(60,45,132,23); room_Choice.Font( Font("Dialog", Font.PLAIN, 13)); } public void refreshRoomList { RoomData room=null; (rooms!=null) { addNewChoice; for( i=0;i< rooms.size;i) { room=(RoomData)(rooms.elementAt(i)); room_Choice.addItem(room.roomName); } (room_Choice.countItems!=0) { room_Choice.select(rooms.getDefaultRoomName); refreshUserList; } } }//method refreshRoomData ended public void refreshUserList { String name=null; RoomData room=null; String names=null; (room_Choice.countItems!=0) { name=room_Choice.getSelectedItem; room=rooms.getRoomByName(name); (room!=null) { users_List.clear; names=room.getUsersName; (names!=null) { for( i=0;i< names.length;i) { users_List.addItem(names[i]); } } } } }// method refreshRoomData ended public void prChat_Area(DataBag data) { String message=null; message=data.name+':'+data.message; (!(message.trim).endsWith("\n")) { message=message+'\n'; } synchronized(this){ chat_TextArea.appendText(message); } } public void sendText { String message=null; DataBag data=null; message=chat_TextField.getText; ((!(message.equals("")))&& (!Character.isISOControl(message.charAt(0)))) { try{ data= DataBag(userName,message,0,0,0,0,0); commandCenter("ask_text",data); chat_TextField.Text(""); prChat_Area(data); }catch(PleaseCloseSocketException e){ message_TextArea.appendText("抱歉不能发送句子"); } } } synchronized public void drawBoard_Canvas(DataBag data) { Color color=null; Graphics g=null; color= Color(data.color); g=board_Canvas.getGraphics; g.Color(color); g.drawLine(data.x0,data.y0,data.x1,data.y1); } //To do with User Event synchronized void chatButton_Clicked(Event event) { sendText; } synchronized void chatTextField_EnterHit(Event event) { sendText; } //change draw color void colorCanvas12_MouseDown(Event event) { currentColor_Canvas.Background(Color.black); currentColor_Canvas.repa;//}} currentColor=Color.black; } void colorCanvas11_MouseDown(Event event) { currentColor_Canvas.Background(Color.cyan); currentColor_Canvas.repa;//}} currentColor=Color.cyan; } void colorCanvas10_MouseDown(Event event) { currentColor_Canvas.Background(Color.blue); currentColor_Canvas.repa; currentColor=Color.blue; } void colorCanvas9_MouseDown(Event event) { currentColor_Canvas.Background(Color.gray); currentColor_Canvas.repa;//}} currentColor=Color.gray; } void colorCanvas8_MouseDown(Event event) { currentColor_Canvas.Background(Color.green); currentColor_Canvas.repa;//}} currentColor=Color.green; } void colorCanvas7_MouseDown(Event event) { currentColor_Canvas.Background(Color.lightGray); currentColor_Canvas.repa;//}} currentColor=Color.lightGray; } void colorCanvas6_MouseDown(Event event) { currentColor_Canvas.Background(Color.magenta); currentColor_Canvas.repa;//}} currentColor=Color.magenta; } void colorCanvas5_MouseDown(Event event) { currentColor_Canvas.Background(Color.orange); currentColor_Canvas.repa;//}} currentColor=Color.orange; } void colorCanvas4_MouseDown(Event event) { currentColor_Canvas.Background(Color.pink); currentColor_Canvas.repa;//}} currentColor=Color.pink; } void colorCanvas3_MouseDown(Event event) { currentColor_Canvas.Background(Color.red); currentColor_Canvas.repa;//}} currentColor=Color.red; } void colorCanvas2_MouseDown(Event event) { currentColor_Canvas.Background(Color.yellow); currentColor_Canvas.repa;//}} currentColor=Color.yellow; } void colorCanvas1_MouseDown(Event event) { currentColor_Canvas.Background(Color.white); currentColor_Canvas.repa;//}} currentColor=Color.white; } void boardCanvas_MouseMove(Event event) { x0=event.x; y0=event.y; } void boardCanvas_MouseDrag(Event event) { DataBag data=null; (sender.sended) { x1=event.x; y1=event.y; data= DataBag("none","none",currentColor.getRGB, x0,y0,x1,y1); drawBoard_Canvas(data); try{ synchronized (this){ piped_out.writeInt(currentColor.getRGB); piped_out.writeInt(x0); piped_out.writeInt(y0); piped_out.writeInt(x1); piped_out.writeInt(y1); } x0=x1; y0=y1; }catch(IOException e1){ message_TextArea.appendText("\n发送图形管道失败"); } } } void Button_Clicked(Event event) { (logged){ try{ commandCenter("ask_", DataBag("none","none",0,0,0,0,0)); message_TextArea.appendText("\n您已经创建了该交谈室"); message_TextArea.appendText("\n现在您可以进行绘画和交谈"); message_TextArea.appendText("\n您已经加入了该交谈室"); belongRoom=true; paused=false; quit_Button.enable; chat_TextField.enable; chat_Button.enable; board_Canvas.enable; pause_Button.enable; log_Button.disable; chat_TextField.Text("请在这里输入谈话句子"); }catch(PleaseCloseSocketException e){ message_TextArea.appendText("\n抱歉无法创建交谈室"); } } } void subjectTextField_KeyRelease(Event event) { String message=null; message=subject_TextField.getText; ((!(message.equals("")))&&(message.charAt(0)!=' ')) { _Button.enable; } { log_Button.disable; } } void quitButton_Clicked(Event event) { try{ (logged) { commandCenter("ask_quit", DataBag("none", "none",0,0,0,0,0)); logged=false; belongRoom=false; log_Button.disable; join_Button.disable; quit_Button.disable; chat_TextField.disable; chat_Button.disable; board_Canvas.disable; pause_Button.disable; _Button.disable; room_Choice.disable; chat_TextField.Text(""); chat_TextArea.Text(""); userName_TextField.Text(""); subject_TextField.Text(""); board_Canvas.repa; users_List.clear; addNewChoice; belongRoom=false; Close; message_TextArea.appendText("\n您已经退出交谈室"); } }catch(PleaseCloseSocketException e){ message_TextArea.appendText("\n抱歉无法退出交谈室"); } } void joinButton_Clicked(Event event) { roomID=0; try{ ((logged&&roomDataValid)&& (room_Choice.getSelectedItem!=null)) { commandCenter("ask_join", DataBag("none","none",0,0,0,0,0)); belongRoom=true; paused=false; message_TextArea.appendText("\n您已经进入该交谈室"); message_TextArea.appendText("\n现在您可以进行绘画和交谈"); quit_Button.enable; chat_TextField.enable; chat_Button.enable; board_Canvas.enable; pause_Button.enable; log_Button.disable; chat_TextField.Text("请在这里输入谈话句子"); } }catch(PleaseCloseSocketException e){ message_TextArea.appendText("\n您不能进入该交谈室"); } } void pauseButton_Clicked(Event event) { (logged&&belongRoom) { (!paused) { try{ commandCenter("ask_pause", DataBag("none","none",0,0,0,0,0)); pause_Button.Label("继续交谈"); message_TextArea.appendText("\n已经暂停交谈"); paused=true; }catch(PleaseCloseSocketException e){ message_TextArea.appendText("\n无法暂停交谈"); } } { try{ commandCenter("ask_continue", DataBag("none","none",0,0,0,0,0)); pause_Button.Label("暂停交谈"); message_TextArea.appendText("\n继续交谈"); paused=false; }catch(PleaseCloseSocketException e){ message_TextArea.appendText("\n无法继续交谈"); } } } } void roomChoice_Action(Event event) { refreshUserList; } void userNameTextField_KeyRelease(Event event) { String message=null; message=userName_TextField.getText; ((message!=null)&&(!(message.equals(""))) &&(message.charAt(0)!=' ')&&(loggedfalse)) { log_Button.enable; userName=message; } { log_Button.disable; userName=null; } } void logButton_Clicked(Event event) { PipedInputStream in=null; PipedOutputStream out=null; try{ openSocket; in= PipedInputStream; out= PipedOutputStream(in); piped_out= DataOutputStream(out); sender= SendDrawData(in,io_out); try{ commandCenter("ask_log", DataBag("none","none",0,0,0,0,0)); logged=true; belongRoom=false; synchronized(this){ noty; } message_TextArea.appendText("\n登录成功."); }catch(PleaseCloseSocketException e) { Close; message_TextArea.appendText("\n抱歉无法登录"); } try{ commandCenter("ask_refresh", DataBag("none","none",0,0,0,0,0)); join_Button.enable; _Button.enable; quit_Button.enable; subject_TextField.enable; room_Choice.enable; message_TextArea.appendText ("\n请选择交谈室\n并点击\"加入交谈室\"钮"); }catch(PleaseCloseSocketException e) { Close; message_TextArea.appendText("\n抱歉无法刷新交谈室数据"); } }catch(IOException e){ message_TextArea.appendText("\n抱歉无法和服务器取得联系"); Close; } } void cleanButton_Clicked(Event e){ board_Canvas.repa; } public void init { super.init; port=Integer.parseInt(getParameter("port")); url=getCodeBase; logo_Image=getImage(url,imageFileName); MediaTracker tracker = MediaTracker(this); tracker.addImage(logo_Image,0); try{ tracker.waitForAll; }catch(Exception e){ .out.prln(e); } logo_width=logo_Image.getWidth(this); logo_height=logo_Image.getHeight(this); //{{INIT_CONTROLS Layout(null); addNoty; resize(610,375+70); repa; Background(Color.lightGray); logo = Logo(logo_Image,460,60); logo_x=(size.width-logo_width)/2; logo_y=(70-logo_height)/2+377; logo.Background(Color.lightGray); logo.reshape(logo_x,logo_y,logo_width,logo_height); add(logo); chat_Button = java.awt.Button("发送"); chat_Button.disable; chat_Button.reshape(552,340,48,24); add(chat_Button); log_Button = java.awt.Button("登录"); log_Button.reshape(144,5,48,24); add(log_Button); log_Button.disable; join_Button = java.awt.Button("加入交谈室"); join_Button.reshape(12,77,72,24); add(join_Button); join_Button.disable; _Button = java.awt.Button("创建交谈室"); _Button.reshape(12,150,72,24); add(_Button); _Button.disable; pause_Button = java.awt.Button("暂停交谈"); pause_Button.reshape(108,150,72,24); add(pause_Button); pause_Button.disable; quit_Button = java.awt.Button("退出交谈室"); quit_Button.reshape(108,77,72,24); add(quit_Button); quit_Button.disable; userName_Label = java.awt.Label("用户名",Label.CENTER); userName_Label.reshape(0,5,60,24); userName_Label.Background(Color.lightGray); add(userName_Label); userName_TextField = java.awt.TextField; userName_TextField.reshape(60,5,72,24); userName_TextField.Font ( Font("TimesRoman", Font.PLAIN, 13)); add(userName_TextField); room_Choice = java.awt.Choice; add(room_Choice); room_Choice.disable; room_Choice.reshape(60,45,132,23); room_Choice.Font( Font("Dialog", Font.PLAIN, 13)); room_Label = java.awt.Label("交谈室",Label.CENTER); room_Label.reshape(0,45,60,24); room_Label.Background(Color.lightGray); add(room_Label); users_List = java.awt.List(5,false); add(users_List); users_List.reshape(12,212,180,60); users_List.Font( Font("Dialog", Font.PLAIN, 13)); subject_TextField = java.awt.TextField; subject_TextField.reshape(80,115,112,24); subject_TextField.Font( Font("TimesRoman", Font.PLAIN, 13)); add(subject_TextField); subject_TextField.disable; subject_Label = java.awt.Label("新交谈室主题",Label.CENTER); subject_Label.reshape(0,115,72,24); subject_Label.Background(Color.lightGray); add(subject_Label); users_Label = java.awt.Label("当前交谈室用户",Label.CENTER); users_Label.reshape(15,185,100,24); users_Label.Background(Color.lightGray); add(users_Label); message_TextArea = java.awt.TextArea; message_TextArea.Editable(false); message_TextArea.appendText("\n欢迎您进入交谈室"); message_TextArea.reshape(12,300,180,72); message_TextArea.Font( Font("Dialog", Font.PLAIN, 13)); add(message_TextArea); message_Label = java.awt.Label("系统信息"); message_Label.reshape(12,276,88,28); message_Label.Background(Color.lightGray); add(message_Label); board_Canvas = java.awt.Canvas; board_Canvas.reshape(216,36,324,216); board_Canvas.Background( Color(16777215)); add(board_Canvas); board_Canvas.addNoty; board_Canvas.disable; board_Label = java.awt.Label("绘画白板"); board_Label.reshape(216,12,100,24); board_Label.Background(Color.lightGray); add(board_Label); clean_Button = java.awt.Button("清除白板图画"); clean_Button.reshape(320,10,90,24); add(clean_Button); color_canvas1 = java.awt.Canvas; color_canvas1.reshape(552,36,20,24); color_canvas1.Background( Color(16777215)); add(color_canvas1); currentColor_Canvas = java.awt.Canvas; currentColor_Canvas.reshape(564,228,20,24); currentColor_Canvas.Background( Color(0)); currentColor= Color(0); add(currentColor_Canvas); color_Canvas12 = java.awt.Canvas; color_Canvas12.reshape(576,156,20,24); color_Canvas12.Background( Color(0)); add(color_Canvas12); color_Canvas11 = java.awt.Canvas; color_Canvas11.reshape(552,156,20,24); color_Canvas11.Background( Color(65535)); add(color_Canvas11); color_Canvas10 = java.awt.Canvas; color_Canvas10.reshape(576,132,20,24); color_Canvas10.Background( Color(255)); add(color_Canvas10); color_Canvas9 = java.awt.Canvas; color_Canvas9.reshape(552,132,20,24); color_Canvas9.Background( Color(8421504)); add(color_Canvas9); color_Canvas8 = java.awt.Canvas; color_Canvas8.reshape(576,108,20,24); color_Canvas8.Background( Color(65280)); add(color_Canvas8); color_Canvas7 = java.awt.Canvas; color_Canvas7.reshape(552,108,20,24); color_Canvas7.Background( Color(12632256)); add(color_Canvas7); color_Canvas6 = java.awt.Canvas; color_Canvas6.reshape(576,84,20,24); color_Canvas6.Background( Color(16711935)); add(color_Canvas6); color_Canvas5 = java.awt.Canvas; color_Canvas5.reshape(552,84,20,24); color_Canvas5.Background( Color(16762880)); add(color_Canvas5); color_Canvas4 = java.awt.Canvas; color_Canvas4.reshape(576,60,20,24); color_Canvas4.Background( Color(16756655)); add(color_Canvas4); color_canvas3 = java.awt.Canvas; color_canvas3.reshape(552,60,20,24); color_canvas3.Background( Color(16711680)); add(color_canvas3); color_Canvas2 = java.awt.Canvas; color_Canvas2.reshape(576,36,20,24); color_Canvas2.Background( Color(16776960)); add(color_Canvas2); currentColor_Label = java.awt.Label("当前色",Label.CENTER); currentColor_Label.reshape(540,192,64,28); currentColor_Label.Background(Color.lightGray); add(currentColor_Label); color_Label = java.awt.Label("调色板",Label.CENTER); color_Label.reshape(540,12,64,24); color_Label.Background(Color.lightGray); add(color_Label); chat_TextField = java.awt.TextField; chat_TextField.reshape(216,340,324,24); chat_TextField.Font( Font("Dialog", Font.PLAIN, 13)); add(chat_TextField); chat_TextField.disable; chat_TextArea = java.awt.TextArea; chat_TextArea.Editable(false); chat_TextArea.reshape(216,264,372,72); chat_TextArea.Font( Font("Dialog", Font.PLAIN, 13)); add(chat_TextArea); //}} } public boolean handleEvent(Event event) { (event.target log_Button && event.id Event.ACTION_EVENT) { logButton_Clicked(event); true; } (event.target userName_TextField && event.id Event.KEY_RELEASE) { userNameTextField_KeyRelease(event); true; } (event.target room_Choice && event.id Event.ACTION_EVENT) { roomChoice_Action(event); true; } (event.target pause_Button && event.id Event.ACTION_EVENT) { pauseButton_Clicked(event); true; } (event.target join_Button && event.id Event.ACTION_EVENT) { joinButton_Clicked(event); true; } (event.target quit_Button && event.id Event.ACTION_EVENT) { quitButton_Clicked(event); true; } (event.target subject_TextField && event.id Event.KEY_RELEASE) { subjectTextField_KeyRelease(event); true; } (event.target _Button && event.id Event.ACTION_EVENT) { Button_Clicked(event); true; } ((event.target board_Canvas) && (event.id Event.MOUSE_DRAG) && (loggedtrue)&&(pausedfalse)) { event.translate(-216,-36); boardCanvas_MouseDrag(event); true; } (event.target board_Canvas && event.id Event.MOUSE_MOVE) { event.translate(-216,-36); boardCanvas_MouseMove(event); true; } (event.target color_canvas1 && event.id Event.MOUSE_DOWN) { colorCanvas1_MouseDown(event); true; } (event.target color_Canvas2 && event.id Event.MOUSE_DOWN) { colorCanvas2_MouseDown(event); true; } (event.target color_canvas3 && event.id Event.MOUSE_DOWN) { colorCanvas3_MouseDown(event); true; } (event.target color_Canvas4 && event.id Event.MOUSE_DOWN) { colorCanvas4_MouseDown(event); true; } (event.target color_Canvas5 && event.id Event.MOUSE_DOWN) { colorCanvas5_MouseDown(event); true; } (event.target color_Canvas6 && event.id Event.MOUSE_DOWN) { colorCanvas6_MouseDown(event); true; } (event.target color_Canvas7 && event.id Event.MOUSE_DOWN) { colorCanvas7_MouseDown(event); true; } (event.target color_Canvas8 && event.id Event.MOUSE_DOWN) { colorCanvas8_MouseDown(event); true; } (event.target color_Canvas9 && event.id Event.MOUSE_DOWN) { colorCanvas9_MouseDown(event); true; } (event.target color_Canvas10 && event.id Event.MOUSE_DOWN) { colorCanvas10_MouseDown(event); true; } (event.target color_Canvas11 && event.id Event.MOUSE_DOWN) { colorCanvas11_MouseDown(event); true; } (event.target color_Canvas12 && event.id Event.MOUSE_DOWN) { colorCanvas12_MouseDown(event); true; } (event.target chat_TextField && event.id Event.ACTION_EVENT) { chatTextField_EnterHit(event); true; } (event.target chat_Button && event.id Event.ACTION_EVENT) { chatButton_Clicked(event); true; } (event.target clean_Button && event.id Event.ACTION_EVENT) { cleanButton_Clicked(event); true; } super.handleEvent(event); } //{{DECLARE_CONTROLS java.awt.Button chat_Button; java.awt.Button log_Button; java.awt.Button join_Button; java.awt.Button _Button; java.awt.Button pause_Button; java.awt.Button quit_Button; java.awt.Label userName_Label; java.awt.TextField userName_TextField; java.awt.Choice room_Choice; java.awt.Label room_Label; java.awt.List users_List; java.awt.TextField subject_TextField; java.awt.Label subject_Label; java.awt.Label users_Label; java.awt.TextArea message_TextArea; java.awt.Label message_Label; java.awt.Canvas board_Canvas; java.awt.Label board_Label; java.awt.Canvas color_canvas1; java.awt.Canvas currentColor_Canvas; java.awt.Canvas color_Canvas12; java.awt.Canvas color_Canvas11; java.awt.Canvas color_Canvas10; java.awt.Canvas color_Canvas9; java.awt.Canvas color_Canvas8; java.awt.Canvas color_Canvas7; java.awt.Canvas color_Canvas6; java.awt.Canvas color_Canvas5; java.awt.Canvas color_Canvas4; java.awt.Canvas color_canvas3; java.awt.Canvas color_Canvas2; java.awt.Label currentColor_Label; java.awt.Label color_Label; java.awt.TextField chat_TextField; java.awt.TextArea chat_TextArea; java.awt.Button clean_Button; Logo logo; Image logo_Image=null; final String imageFileName="cdownlogo.jpg"; //}} } // applet ended // 8:RoomDataApplet引用交谈室数据类 RoomData { String roomName=null; roomID=0; Vector users=null; RoomData(String name) { roomName=name; users= Vector(10,5); } public void addUser(String name) { users.addElement(name); } public void removeUser(String name) { users.removeElement(name); } public String getUsersName { Enumeration e=null; String s=null; ((users!=null)&(users.size >0)) { e=users.elements; s= String[users.size]; for( i=0;i< s.length;i) { s[i]=(String)(users.elementAt(i)); } } s; } public usersCount { users.size; } } // 'RoomData' ended // 9:RoomsApplet所用交谈室数据类 Rooms extends Vector { String defaultSubject=null; public Rooms( a, b) { super(a,b); defaultSubject=RoomGroup.DEFAULT_ROOM_SUBJECT; } public void Default(String name){ (getRoomByName(name)!=null) { defaultSubject=name; } } public String getDefaultRoomName { defaultSubject; } public getRoomID(String name) { index=0; for( i=0;i< size;i) { (((RoomData)elementAt(i)).roomNamename) { index=((RoomData)elementAt(i)).roomID; index; //; } } -1; } public RoomData getRoomByName(String name) { index=0; for( i=0;i< size;i) { ((((RoomData)elementAt(i)).roomName).equals(name)) { index=i; ((RoomData)elementAt(i)); } } null; } } /// 10:DataBag包装图形和文字信息类 DataBag { String message=null; String name=null; color=0,x0=0,y0=0,x1=0,y1=0; DataBag(String name,String message, color, x0, y0, x1, y1) { this.name=name; this.message=message; this.color=color; this.x0=x0; this.y0=y0; this.x1=x1; this.y1=y1; } } // 11:SendDrawApplet后台数据传输类 SendDrawData extends Thread { volatile boolean sended=true; DataInputStream io_in=null; DataOutputStream io_out=null; SendDrawData(PipedInputStream io_in,DataOutputStream io_out) { super; this.io_in= DataInputStream(io_in); this.io_out=io_out; start; } public void run { color,x0,y0,x1,y1; try{ while(true) { color=io_in.readInt; x0=io_in.readInt; y0=io_in.readInt; x1=io_in.readInt; y1=io_in.readInt; sended=false; synchronized(this) { io_out.writeUTF("draw"); io_out.writeInt(color); io_out.writeShort(x0); io_out.writeShort(y0); io_out.writeShort(x1); io_out.writeShort(y1); } sended=true; } }catch(IOException e){ try{ io_in.close; io_in=null; io_out.flush; io_out.close; io_out=null; }catch(IOException r){} } } public void quit { try{ io_in.close; io_out.flush; io_in=null; }catch(IOException e){ .out.prln(e); } stop; } } //cl
标签:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: