关键字: 网络涂鸦板
这是我自己写的一个C/S架构的类似MSN的聊天工具,当然功能和稳定性都差远了。下面就直入正题(由于篇幅过长,所以分两篇)
一、功能
多人在线绘图,即时显示,群聊,私聊,在线隐身转换,点歌,更改本地字体,剪切复制等很基本的功能,但都不是很完善。有兴趣的朋友可以看一下,对照这些功能可以再完善一下。
二、主要代码介绍
主要部分是ServerThread.java,ServerStartWindow.java,ClientThread.java,ClientFrame.其
中ServerThread.java是服务器端用来处理多用户请求的一个线程,而ServerStartWindow.java负责连接这些线程。
ClientThread.java是客户端的一个线程,负责接收服务器传来的信息,ClientFrame是客户端的界面,同时还肩负着向服务器发送信
息的任务。下面我着重介绍一下这几个类。
ServerThread.java
1. public ServerThread(Socket s, Vector<ServerThread> v) {
2. this.socket = s;
3. this.threads = v;
4. try {
5. oos = new ObjectOutputStream(socket.getOutputStream());
6. ois = new ObjectInputStream(socket.getInputStream());
7. new Thread(new Runnable() {
8.
9. public void run() {
10. boolean first=true;
11. while (true) {
12. try {
13. write(checkDatabase.getOnlineUser());
14. if(first){
15. Thread.sleep(1000);
16. first=false;
17. }else{
18. Thread.sleep(5000);
19. }
20. } catch (Exception e) {
21. }
22. }
23. }
24. }).start();
25. } catch (IOException e) {
26. e.printStackTrace();
27. }
28. }
|
这个构造函数并没什么特别,就是获得一个连接客户端的Socket,并且得到一个Vector,这个向量存储的是连接的服务器的所有线程。而那个run()主要是为了实时更新在线用户列表,我想不出别的办法就用了这。
然后是这个线程类最重要的run方法(由于太长,只截取部分,附有源代码)
public void run() {
Object o = this.read();
String flag = (String) o;
if (flag.substring(0, 4).equals("name")) {
sname = flag.substring(4);
this.write(this.currentImage);
System.out.println("have write currentImage");
o = null;
while (true) {
o = this.read();
System.out.println("have read");
if (o == null) {
System.out.println("read null");
}
if (o instanceof String) {
String msg = (String) o;
if (msg.trim().equals("quit")) {
checkDatabase.setUserOffline(sname);
for (int i = 0; i < threads.size(); i++) {
ServerThread st1 = threads.elementAt(i);
st1.write("**********************" + sname + " leave ***********************\n");
st1.write(checkDatabase.getOnlineUser());
System.out.println("quit");
}
threads.remove(this);
break;
} else if (msg.equals("iwanthide")) {
checkDatabase.setUserOffline(sname);
for (int i = 0; i < threads.size(); i++) {
ServerThread st1 = threads.elementAt(i);
st1.write(checkDatabase.getOnlineUser());
}
} else if
………………
………………
|
我写的很长,主要是这是整个系统的关键所在,就是这个线程负责整体的协调调度。开始先读入一个对象Object(由于不知道客户端会发来什么信息),后面就是对这些信息分类并分别处理。具体作用已在注释里写的很清楚了。
ServerStartWindow.java
主要代码如下:
static void showFrame() {
String msg = "";
ServerFrame sf = new ServerFrame();
sf.setVisible(true);//关闭窗口时退出程序
ServerSocket socket = null;
Vector<ServerThread> threads = new Vector<ServerThread>();
msg += "listen\n";
sf.jTextPaneServerMessage.setText(msg);
try {
socket = new ServerSocket(8888);
} catch (Exception e) {
msg += "server failed....\n";
sf.jTextPaneServerMessage.setText(msg);
return;
}
CheckDatabase checkDatabase=new CheckDatabase();
sf.setJList(checkDatabase.getAllUser());
try {
int ID = 0;
while (true) {
Socket s = socket.accept();
msg += "accepted\n";
sf.jTextPaneServerMessage.setText(msg);
ServerThread st = new ServerThread(s, threads);
st.setID(ID++);
threads.addElement(st);
new Thread(st).start();
msg += "listen again....\n";
sf.jTextPaneServerMessage.setText(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
|
阅读(1186) | 评论(0) | 转发(0) |