这周的作业是黄金点服务器的编写

看到这个题目,我整个人都绝望了

之前从来没有涉及过服务器的编写

也不知道服务器编写需要哪些知识

光是想想服务器要处理的什么注册啊,什么协议啊之类的就头疼

而且百度了一个星期未果

于是我打算放弃治疗! 2013.11.3

 

 

 

今天又突发奇想,百度了一个聊天室的java开源程序

 

大肆修改以后完成了初级版的服务端

 

能够在客户端输入一个值以后统计出每个客户端输入的sum

 

然后除以sum数*0.618

 

现在的功能仅限于此 

无法控制客户端的用户名和密码

无法控制轮数

但是作为一个初级的版本我觉得应该能实现通讯和运算的功能了    2013.11.4

 

 

 

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

public class ChatServer {
    static int sum=0;
      
  public static void main(String args[])
  {
          
        
        ServerSocket socket=null;
        Vector m_threads=new Vector();
        System.out.println("服务器已启动,正在等待客户的请求...");
        
        try
        {
            //设置Server监听端口号为8000, 这个数字必须
            //和程序ChatClient中的port参数一致。
            socket=new ServerSocket(8000);
        }
        catch(Exception e)
        {
            System.out.println("服务接口建立失败!");
            return;
        }
        try
        {
            int nid=0;
            
            while(true)
            {
                //监听是否有新Chat Applet连接到Server,
                //线程运行到该语句会封锁,直到有新的连接产生。
                Socket s=socket.accept();
                //创建一个新的ServerThread.
                ServerThread  st=new  ServerThread(s,m_threads);
                //为该线程设置一个ID号。
                st.setID(nid);
                //将该线程加入到m_threads Vector中。
                m_threads.addElement(st);
                //启动服务线程。
                new Thread(st). start();
                //通知所有Chat Applet有一个新的网友加入。
                for(int i=0;i<m_threads.size();i++)
                {
                    ServerThread st1=(ServerThread)m_threads.elementAt(i);
                    st1.write("<服务器>欢迎 "+st.getID());
                }
                System.out.println("接受"+st.getID()+"号客户请求");
                System.out.println("继续等待其他客户的请求...\n");
                System.out.println(sum);    
                System.out.println(sum/m_threads.size()*0.618);    

            }
            
            
        }
        catch(Exception e)
        {
            System.out.println("服务器已关闭...");
        }


    }
}
/*
* 监听线程,监听对应的Chat Applet是否有信息传来。
*/
    class ServerThread implements Runnable
    {
        
        static int[] temp=new int[100];
        Vector m_threads;
        Socket m_socket=null;
        DataInputStream m_in=null;
        DataOutputStream m_out=null;
        int m_nid;
        //初始化该线程。
        public ServerThread(Socket s,Vector threads)
        {
            m_socket=s;
            m_threads=threads;
            try
            {
                m_in=new DataInputStream(m_socket.getInputStream());
                m_out=new DataOutputStream(m_socket.getOutputStream());
            }
            catch(Exception e)
            {
            }
        }
        public void run()  //线程的执行体。
        {
            
            
            System.out.println("等待进程正在运行");
            try
            {
                while(true)
                {
                    //监听对应的Applet是否传来消息
                    //程序陷入到m_in.readUTF()中,直到有信息传来才返回。
                    String s=m_in.readUTF();                    

                    if (s==null)
                      break;
                    else
                    //向所有Chat Applet广播该信息。
                    for(int i=0;i<m_threads.size();i++)
                    {
                        ServerThread st=(ServerThread)m_threads.elementAt(i);
                        st.write("<"+getID()+"朋友说>"+s);
                                       
                    }
                    temp[getID()]=Integer.parseInt(s);
                    ChatServer.sum=ChatServer.sum+temp[getID()];
                }
            }
            catch(Exception e)
            {  e.printStackTrace();
            }
            //从m_threads Vector中删除该线程,表示该线程已经离开聊天室。
            m_threads.removeElement(this);
            try
            { m_socket.close();
            }
            catch (Exception e){}
        }
        //将msg送回对应的Applet
        public void write (String msg)
        {
            synchronized(m_out)
            {
                try
                {
                    m_out.writeUTF(msg);
                }
                catch(IOException e){}
            }
        }
        public int getID()  //获得该线程的ID.
        {
            return m_nid;
        }
        public void setID(int nid)  // //设置线程的ID.
        {
            m_nid=nid;
        }

}

 

 

 

 

 

 

 

作业写的不好可以用读书笔记来弥补的对吧~

 

 老师说可以通过阅读《代码大全》一书写点读书笔记来保全自己的分数

 

于是这次我打算写读书笔记,因为实在是写不出来

等到下次写客户端的时候我可以再试试。。。

 

读书笔记部分

第一章 谈构建

这本《代码大全》是室友杨超同学通过自己黄金点游戏的胜利挣来了

我这周由于做不出作业,借来看看

看了目录以后我还是有点吃惊的

本来以为这本书是把有用的代码罗列出来供我们程序员来参考借鉴的

其实不然

在书的一开始是介绍一个软件的构建还有“隐喻”的重要性

由此可见,在一个软件编写的过程中,最先开始的不是软件代码的编写

而是对软件在计划、设计、检查等方面的准备工作

代码编写只是软件的一部分,不是全部

这正如我们这学期所学的软件工程课程一样

软件开发包含着各种各样不同的过程

其中有定义问题,需求分析,规划构建,软件架构,详细设计,编码和调试,单元测试,集成测试,集成,系统测试,保障维护的工作

可能在不太正规的编程工作里面,就比如我们这种学生的编程项目

我们无法分辨出一个软件的开发过程竟然包含着如此多的过程

但是实际上,当我们进行一个十分正式的项目的时候,就需要这些过程

而我们程序员所要在项目中做的事情

不只是编码那么简单

还有一系列的测试工作

这些统称为“构建”

构建活动是软件开发的主要组成部分

根据项目规模的不同,构建活动在整个软件开发活动总时间中所占比例一般在30%-80%之间

因此,构建活动会影响到一个项目的成败

软件开发中,构建活动是一个核心的内容,其他的活动或是说构建的铺垫,或是说构建的收尾

需求分析和架构设计是在构建前完成的基础工作

他为一个构建活动打下了坚实的基础

而系统测试是为了验证构建项目的正确性

他为一个构建活动画龙点睛

这是第一章告诉我们的内容

第二章 谈隐喻

在软件领域,我们常常能听到各种各样生动形象的比喻

蠕虫病毒,特洛伊木马什么的

这描述了软件领域中各种特定的现象和事物

而在软件开发的过程中

类比,比喻这样的构建方法是十分常见的

这种方法给他一个学名——建模

提到建模我就能够明白隐喻在软件开发中的地位了

“编程这门学科还没有那么先进,或许永远不可能那么先进”

对于编程来说,最大的挑战是将问题概念化

因此,能够大致的知道如何解决一类问题其实和知道如何解决一个问题的价值相同了

本章节中介绍了软件中的一些隐喻

比如软件中的书法——写作代码

软件中的耕作法——培植系统

软件的牡蛎养殖——系统成长

软件的构建——建造软件

这些隐喻都是一种启发式的方法二不是算法,因此它们彼此并不排斥

在软件领域中

合理的利用隐喻能够帮助我们把所有的方法、技术和技巧留在我们的脑海中

以至于我们在合适的时间拿来就用

这不由得让我想起来了我们在高中时代老师所教的记忆方法

就像联想记忆法

在你想记忆一个东西的时候

你记忆这个陌生的你要记忆的内容相关的你所熟悉的内容

在你想起熟悉的内容时自然就能记得陌生的内容了

真是有异曲同工之妙啊

第二章结束

第三章 前期准备

看到这个题目,我便能感觉到这章的重要性

俗话说完事开头难

如果一个软件的准备工作没有做好

后面的构建工作无从谈起

就像工人们盖房子

如果他们没有拿到一个建筑的蓝图,没有打下坚实的地基

那么如何盖出漂亮的房子?

一个项目的成败很大程度上在构建活动开始前就已经注定了

对于准备工作

他的核心思想是降低一个项目风险性

一个好的项目规划者需要尽可能早的把主要风险清除掉

以便项目能够平稳的进行

否则在项目实施的过程中这些风险就可能像定时炸弹一样爆发

在这章中还提到了“关于开始构建之前要做前期准备的绝对有利且简明的论据”

其中包含

诉诸逻辑(Appeal to logic)

开始动手制作软件之前,先好好思考打算如何做,这样可以花费更少的时间和金钱,以免自己走入死胡同

诉诸类比(Appeal to Analogy)

这和第二章所诉的类似,利用形象生动的事物来找到一个程序的结构

诉诸数据(Appeal to Data)

利用从前成功的案例来修正自己案例的错误和缺陷

在其后

我们需要辨明我们的软件的类型

书中为了我们罗列了常见的软件类型

掌握了自己的软件类型才能让我们更加明确的做好前期工作

书中还为我们介绍了迭代开发法

就是在完成进度的过程中返工

这样可以比在完成100%后返工节省更多的返工成本

正如上表所示,可以看出迭代方法能够节省不少成本

暂时先写这么多吧