• homework-05


    结对编程队员

    046  &&   195

    接口设计

    客户端 用户登录后,启动一个线程来进行游戏,等待服务器信息及发送新数据

    服务器  开始时,主程序一直等待用户登录,有新用户登录就开一个线程去为其服务

               等到用户都登录完成,服务器开启一个游戏控制线程每隔1秒给全部用户发送一个“START” 信息,通知用户开始新的一轮开始,然后在0.5秒以后计算数据和分数,然后给全部用户发送这一轮结果。

    服务器为每个用户都提供了一个服务线程,用于接收用户提交的数据

    设计思路

       本次设计 client/server 的程序是基于socket通信原理设计,具体如下:

      ServerListen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过SendWrite等方法与对方通信。

      其工作过程包含以下四个基本的步骤:

      (1) 创建Socket;

      (2) 打开连接到Socket的输入/出流;

      (3) 按照一定的协议对Socket进行读/写操作;

      服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响 应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。

    server=new ServerSocket(6000);
    socket=new Socket();
    System.out.println ("Server is beginning......");
    while(true){
      socket = server.accept();
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       String userMess = br.readLine();
       System.out.println(userMess);
       String[] mess = userMess.split(":");
       System.out.println(userMess);
    //登录
                        if(mess[3].equals(excel.getUserPassword(mess[1]))){
                            UserMessage userNew=new UserMessage(mess[1],mess[2],socket);
                            if(addNewClient(userNew)){
                                PrintWriter pw=new PrintWriter(socket.getOutputStream());
                                pw.println("NORMAL");
                                pw.flush();
                            
                                ServerThread thread=new ServerThread(userNew);
                                thread.start();
                                System.out.println("电脑|" + dateString + "|登录成功|" + mess[1]);
                            }
                            else{
                                PrintWriter pw=new PrintWriter(socket.getOutputStream());
                                pw.println("ON");
                                pw.flush();
                                System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]);
                            }
                        }
                        else{
                            PrintWriter pw=new PrintWriter(socket.getOutputStream());
                            pw.println("NO");
                            pw.flush();
                            System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]);
                        }
                    }

      客户端向主机的某一个端口发出客户请求登陆服务器

    try {
                serverip = InetAddress.getLocalHost().getHostAddress();
                System.out.println(serverip);
            } catch (UnknownHostException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
    }

    客户端向服务器发送和接收信息

       public String getMessage(String head,String username,String mess){        
            StringBuffer buffer=new StringBuffer(head+":");
            buffer.append(username).append(":").append(mess);
            return buffer.toString();
        }
        
        public void sendMessageToServer(String message){
            try {
                PrintWriter pw=new PrintWriter(socket.getOutputStream());       
                pw.println(message);
                pw.flush();
            }

      每次游戏开始服务器启动一个TimerTask(),计算黄金点,并将各种数据返回到每一个客户端

            if(newGame == 0){
                      for (int i = 0; i<list.size(); i++){
                        UserMessage user=(UserMessage)list.get(i);
                        Socket sok=user.getSocket();
                        sentMessageToClient(sok,"START");
                        }
                      newGame = 1;
                  }
                  else {
                          turns++;
                          System.out.println("turns = "+turns);
                          newGame = 0;
                          
                          //计算G点
                          Gpoint = Sum/list.size()*0.618;
                          System.out.println("Now Gpoint = "+Gpoint);
                          
                          //计算每个玩家分数  第一名加分  最后一面的减分
                          double xxx = 10000,max = 0,min = 100000;
                          int best=0,sb=0;
                        for (int i = 0; i<list.size(); i++){
                            UserMessage user=(UserMessage)list.get(i);
                              xxx = Math.abs(user.submit -  Gpoint);
                              System.out.println(user.getName()+" "+user.submit+"-"+Gpoint);
                              if(xxx > max){
                                  sb =i;
                                  max = xxx;
                              }
                              if(xxx < min){
                                  best =i;
                                  min = xxx;
                              }
                        }
                        
                        UserMessage sbuser=(UserMessage)list.get(sb);
                        UserMessage bestuser=(UserMessage)list.get(best);
                        sbuser.score -= 1;
                        bestuser.score += 10;
                        
                        StringBuffer buffer=new StringBuffer("");
                          for (int j = 0; j<list.size(); j++){
                            UserMessage userx=(UserMessage)list.get(j);
                            buffer.append(":"+userx.getName()+"    "+userx.score);
                        }
                          for (int i = 0; i<list.size(); i++){
                            UserMessage user=(UserMessage)list.get(i);
                            Socket sok=user.getSocket();
                            sentMessageToClient(sok,"GPOINT"+":"+turns+":"+Gpoint+buffer.toString());
                        }
                        //游戏结束
                        if(turns == 10){
                            System.out.println("Game Over");
                            //输出用户得分
                            for (int i = 0; i<list.size(); i++){
                                UserMessage user=(UserMessage)list.get(i);
                                System.out.println(""+user.getName()+" score is "+user.score);
                                }
                            this.cancel();
                            System.out.println("end?!");
                        }
                  }   

    运行界面

  • 相关阅读:
    Lambda表达式详解 (转)
    usb驱动开发21之驱动生命线
    usb驱动开发18之设备生命线
    usb驱动开发17之设备生命线
    usb驱动开发16之设备生命线
    usb驱动开发15之设备生命线
    usb驱动开发14之设备生命线
    usb驱动开发13之设备生命线
    usb驱动开发12之设备生命线
    usb驱动开发11之设备生命线
  • 原文地址:https://www.cnblogs.com/jun1022/p/3405273.html
Copyright © 2020-2023  润新知