Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53645
  • 博文数量: 10
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 21:59
文章分类

全部博文(10)

文章存档

2011年(1)

2008年(9)

我的朋友
最近访客

分类: Java

2008-08-06 19:25:20

关键字: 网络涂鸦板

    这是我自己写的一个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) |
给主人留下些什么吧!~~