客户端 用户登录后,启动一个线程来进行游戏,等待服务器信息及发送新数据
服务器 开始时,主程序一直等待用户登录,有新用户登录就开一个线程去为其服务
等到用户都登录完成,服务器开启一个游戏控制线程每隔1秒给全部用户发送一个“START” 信息,通知用户开始新的一轮开始,然后在0.5秒以后计算数据和分数,然后给全部用户发送这一轮结果。
服务器为每个用户都提供了一个服务线程,用于接收用户提交的数据
3个用户 运行10轮
只在这里提供重要代码
1 import java.net.ServerSocket; 2 import java.net.Socket; 3 import java.io.File; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.BufferedReader; 7 import java.io.PrintWriter; 8 import java.text.SimpleDateFormat; 9 import java.util.ArrayList; 10 import java.util.Date; 11 import java.util.List; 12 import java.util.Timer; 13 import java.util.TimerTask; 14 15 import javax.swing.JFrame; 16 17 public class ServerDemo extends JFrame{ 18 public static ArrayList<UserMessage> list=new ArrayList(); 19 public static int newGame = 0; 20 public static boolean gameStart = true; 21 public static double Gpoint = 0; 22 public static double Sum = 0; 23 public static int turns = 0; 24 public static List <Double>G_List = new ArrayList<Double>(); 25 public static ViewFrame vf; 26 public static String getAllUsersList(){ 27 StringBuffer buffer=new StringBuffer("USER"); 28 for (int i = 0; i<list.size(); i++){ 29 UserMessage user=(UserMessage)list.get(i); 30 buffer.append(":").append(user.getName()); 31 } 32 return buffer.toString(); 33 } 34 public static void sendAllUsersList(){ 35 PrintWriter pw=null; 36 String listUsers=getAllUsersList(); 37 // System.out.println (listUsers); 38 for (int i = 0; i<list.size(); i++){ 39 UserMessage user=(UserMessage)list.get(i); 40 if(user.getName().equals("admin")) 41 continue; 42 try { 43 pw=new PrintWriter(user.getSocket().getOutputStream()); 44 pw.println(listUsers); 45 pw.flush(); 46 47 } 48 catch (Exception ex) { 49 } 50 51 } 52 } 53 public static boolean addNewClient(UserMessage userNew){ 54 String name=userNew.getName(); 55 boolean flag=false; 56 for (int i = 0; i<list.size(); i++){ 57 UserMessage user=(UserMessage)list.get(i); 58 if((user.getName()).equals(name)){ 59 flag=true; 60 break; 61 } 62 } 63 if(!flag){ 64 list.add(userNew); 65 //System.out.println (userNew.getName()+" 进入聊天室"); 66 return true; 67 } 68 else 69 return false; 70 71 } 72 73 public static void sayToAllUsers(String msg){ 74 //System.out.println ("群聊"); 75 for (int i = 0; i<list.size(); i++){ 76 UserMessage user=(UserMessage)list.get(i); 77 //System.out.println(user.getName()); 78 if(user.getName().equals("admin")) 79 continue; 80 Socket sok=user.getSocket(); 81 sentMessageToClient(sok,msg); 82 } 83 84 } 85 86 public static void sentMessageToClient(Socket sok,String msg){ 87 try { 88 PrintWriter pw=new PrintWriter(sok.getOutputStream()); 89 pw.println(msg); 90 pw.flush(); 91 } 92 catch (Exception ex) { 93 } 94 } 95 public static void addsubmit( double d){ 96 Sum += d; 97 System.out.println("Sum "+ Sum + " "+ turns); 98 } 99 100 public static void startGame(){ 101 turns = 0; 102 Timer timer = new Timer(); 103 TimerTask task = new TimerTask() { 104 public void run() { 105 if(newGame == 0){ 106 if(turns >= 10){ 107 this.cancel(); 108 System.out.println("end?!"); 109 } 110 for (int i = 0; i<list.size(); i++){ 111 UserMessage user=(UserMessage)list.get(i); 112 Socket sok=user.getSocket(); 113 sentMessageToClient(sok,"START"); 114 } 115 newGame = 1; 116 } 117 118 else { 119 turns++; 120 System.out.println("turns = "+turns); 121 newGame = 0; 122 123 //计算G点 124 Gpoint = Sum/list.size()*0.618; 125 System.out.println("Now Gpoint = "+Gpoint); 126 127 //计算每个玩家分数 第一名加分 最后一面的减分 128 double xxx = 10000,max = 0,min = 100000; 129 int best=0,sb=0; 130 for (int i = 0; i<list.size(); i++){ 131 UserMessage user=(UserMessage)list.get(i); 132 xxx = Math.abs(user.submit - Gpoint); 133 System.out.println(user.getName()+" "+user.submit+"-"+Gpoint); 134 if(xxx > max){ 135 sb =i; 136 max = xxx; 137 } 138 if(xxx < min){ 139 best =i; 140 min = xxx; 141 } 142 } 143 UserMessage sbuser=(UserMessage)list.get(sb); 144 UserMessage bestuser=(UserMessage)list.get(best); 145 sbuser.score -= 1; 146 bestuser.score += 10; 147 148 StringBuffer buffer=new StringBuffer(""); 149 StringBuffer Ubuffer=new StringBuffer("用户 分数"); 150 for (int j = 0; j<list.size(); j++){ 151 UserMessage userx=(UserMessage)list.get(j); 152 buffer.append(":"+userx.getName()+" "+userx.score); 153 Ubuffer.append("\n"+userx.getName()+" "+userx.score); 154 } 155 156 for (int i = 0; i<list.size(); i++){ 157 UserMessage user=(UserMessage)list.get(i); 158 Socket sok=user.getSocket(); 159 sentMessageToClient(sok,"GPOINT"+":"+turns+":"+Gpoint+buffer.toString()); 160 } 161 String src=vf.JTextArea_mess.getText(); 162 if(src.equals("")){ 163 vf.JTextArea_mess.setText("第"+turns+"轮Gpoint是"+Gpoint); 164 }else{ 165 vf.JTextArea_mess.setText(src+"\n"+"第"+turns+"轮Gpoint是"+Gpoint); 166 } 167 vf.JTextArea_user.setText(Ubuffer.toString()); 168 Gpoint = 0; 169 Sum = 0; 170 System.out.println("end turns = "+turns); 171 } 172 } 173 }; 174 timer.schedule(task, 0, 500); 175 } 176 177 public static void main (String[] args) { 178 ServerSocket server = null; 179 Socket socket = null; 180 181 182 vf = new ViewFrame(); 183 vf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 184 vf.setSize(400,400); 185 vf.setVisible(true); 186 187 try { 188 server=new ServerSocket(6000); 189 socket=new Socket(); 190 System.out.println ("Server is beginning......"); 191 while(gameStart){ 192 socket = server.accept(); 193 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 194 String userMess = br.readLine(); 195 System.out.println(userMess); 196 String[] mess = userMess.split(":"); 197 System.out.println(userMess); 198 if(mess[0].equals("LOGIN")){ 199 File fl = new File("test.xls"); 200 Excel excel = new Excel(fl); 201 System.out.println("some one enter"); 202 Date currentTime = new Date(); 203 SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 204 String dateString = formatter.format(currentTime); 205 206 //登录 207 if(mess[3].equals(excel.getUserPassword(mess[1]))){ 208 UserMessage userNew=new UserMessage(mess[1],mess[2],socket); 209 if(addNewClient(userNew)){ 210 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 211 pw.println("NORMAL"); 212 pw.flush(); 213 214 ServerThread thread=new ServerThread(userNew); 215 thread.start(); 216 System.out.println("电脑|" + dateString + "|登录成功|" + mess[1]); 217 } 218 else{ 219 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 220 pw.println("ON"); 221 pw.flush(); 222 System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]); 223 } 224 } 225 else{ 226 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 227 pw.println("NO"); 228 pw.flush(); 229 System.out.println("电脑|" + dateString + "|登录失败|" + mess[1]); 230 } 231 } 232 } 233 } 234 catch (Exception ex) { 235 } 236 } 237 }
import java.awt.Point; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; class ClientThread extends Thread{ private Socket socket; private ClientDemo client; public boolean flag = true; public ClientThread(Socket socket,ClientDemo client){ this.socket=socket; this.client=client; } public void run(){ while(flag){ try { BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String msg=br.readLine(); String mess[]=msg.split(":"); if(mess[0].equals("START")){ client.sendGpoint(); } if(mess[0].equals("GPOINT")){ client.gpoint = Double.parseDouble(mess[1]); StringBuffer buffer=new StringBuffer("第"); buffer.append(mess[1]).append("轮").append("Gpoint是").append(mess[2]); String src=client.JTextArea_mess.getText(); if(src.equals("")){ client.JTextArea_mess.setText(buffer.toString()); }else{ client.JTextArea_mess.setText(src+"\n"+buffer.toString()); } StringBuffer ubuffer=new StringBuffer("用户 分数 \n"); for(int i=3; i<mess.length; i++) ubuffer.append(mess[i]+"\n"); client.JTextArea_user.setText(ubuffer.toString()); } if(mess[0].equals("STATE")){ StringBuffer buffer2 = new StringBuffer(mess[2]); if(mess[1].equals("UP")){ buffer2.append(" 上线了 @" + mess[3] + ":" + mess[4] + ":" + mess[5]); if(mess[6].equals("M")) buffer2.append(" [手机]"); } else{ buffer2.append(" 下线了 @" + mess[3] + ":" + mess[4] + ":" + mess[5]); if(mess[6].equals("M")) buffer2.append(" [手机]"); } String src=client.JTextArea_mess.getText(); if(src.equals("")){ client.JTextArea_mess.setText(buffer2.toString()); } else{ client.JTextArea_mess.append("\n"+buffer2.toString()); Point p= new Point(0,client.JTextArea_mess.getLineCount()*20); client.JScrollPane_mess.getViewport().setViewPosition(p); } } } catch (Exception ex) { } } } }
这一个终于有了小伙伴,有小伙伴一起编程效率高了许多~
Personal Software Process Stages |
原来估计的时间 (分钟) |
实际花费的时间 (分钟) |
|
|
Planning |
计划 |
20 | 30 | |
· Estimate |
· 估计这个任务需要多少时间,把工作细化并大致排序 |
20 | 30 | |
Development |
开发 |
60 | 90 | |
· Analysis |
· 需求分析 (包括学习新技术) |
10 | 15 | |
· Design Spec |
· 生成设计文档 |
0 | 0 | |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 | 0 | |
· Coding Standard |
· 代码规范 (制定合适的规范) |
0 | 0 | |
· Design |
· 具体设计 |
5 | 7.5 | |
· Coding |
· 具体编码 |
20 | 30 | |
· Code Review |
· 代码复审 |
5 | 7.5 | |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 | 30 | |
Reporting |
总结报告 |
20 | 30 | |
· Test Report |
· 测试报告 |
10 | 15 | |
· Size Measurement |
· 计算工作量 |
5 | 7.5 | |
· Postmortem & Improvement Plan |
· 事后总结, 并提出改进 |
5 | 7.5 | |
Total |
总计 |
总估计的用时 |
总用时 |
|