问题描述
我是个对java还在学习阶段的新人,写了个比较简陋的CS通信模型,希望大家帮忙找找需要改进注意和规范的地方,最好能给个进阶的学习方向,十分感谢=w=publicclassSocketServer{publicstaticintAllThreadNum;//总线程数publicstaticvoidmain(Stringargs[]){try{ServerSocketserver=newServerSocket(9000);inttNum=0;//线程编号while(true){Socketsocket=server.accept();newThread(newTask(socket,++tNum)).start();++AllThreadNum;}}catch(IOExceptionex){ex.printStackTrace();}}staticclassTaskimplementsRunnable{privateSocketsocket;privateStudentstu;privateintThreadNum;publicTask(Socketsocket,inttn){this.socket=socket;this.ThreadNum=tn;}publicvoidrun(){try{//连接数据库Class.forName("com.mysql.jdbc.Driver");System.out.println("Thread"+ThreadNum+""+":"+"SuccessloadingMysqlDriver!");Connectionconnect=DriverManager.getConnection("jdbc:mysql://localhost:3306/firsttry","root","594278");System.out.println("Thread"+ThreadNum+""+":"+"SuccessconnectMysqlserver!");//线程正式开始服务ClientReceiveAndSend(connect);}catch(SocketExceptione){System.out.println("连接意外断开,关闭服务");return;}catch(Exceptione){e.printStackTrace();return;}}privatevoidReceiveAndSend(Connectionc)throwsException{DataInputStreamreader;reader=newDataInputStream(socket.getInputStream());while(true){if(!socket.isInputShutdown()){System.out.println("等待Client发送的消息");charhead=reader.readChar();int[]a=newint[3];a[0]=reader.readInt();a[1]=reader.readInt();a[2]=reader.readInt();System.out.println(a.toString());if(!AnalyseData(head,a)){socket.shutdownOutput();socket.shutdownInput();socket.close();System.out.println("连接已安全断开");--AllThreadNum;return;}}else{socket.close();System.out.println("close");return;}}}//分析客户端数据,处理并反馈结果privatebooleanAnalyseData(chartype,int[]data){switch(type){case'雪':System.out.println('雪');SendDataBack();break;case'白':System.out.println('白');SendDataBack();break;case'关':System.out.println("收到来自Client的关闭请求");SendDataBack();returnfalse;default:break;}returntrue;}//处理完Client的消息后回复ClientprivatevoidSendDataBack(){try{DataOutputStreamwriter=newDataOutputStream(socket.getOutputStream());charhead='B';int[]b={1,2,3};writer.writeChar(head);writer.writeInt(b[0]);writer.writeInt(b[1]);writer.writeInt(b[2]);writer.flush();}catch(IOExceptionioe){ioe.printStackTrace();}}}}
publicclassSocketClient{protectedstaticArrayListdata;privatestaticSocketsocket;privatestaticbooleanisWait;//是否在等待服务器消息反馈privatestaticbooleanisOver;//用于与等待服务器消息的线程同步关闭publicstaticvoidmain(String[]args){data=newArrayList();isWait=false;isOver=false;try{socket=newSocket("127.0.0.1",9000);DataOutputStreamwriter=newDataOutputStream(socket.getOutputStream());//创建监听消息线程WaitForMsglisten=newWaitForMsg(socket);listen.start();//发送消息循环while(true){Scannersdata=newScanner(System.in);charinputdata=sdata.nextLine().charAt(0);SendData(inputdata,writer);System.out.println("发送完成");if(inputdata=='关')//准备退出{sdata.close();break;}isWait=true;while(isWait==true){System.out.println("waiting......");}for(inti=0;i<data.size();i++){System.out.println(data.get(i));}}listen.stop();}catch(UnknownHostExceptionex){ex.getStackTrace();}catch(SocketExceptionex){System.out.println("连接发生错误");isOver=true;}catch(IOExceptionex){ex.printStackTrace();isOver=true;}}publicstaticvoidSendData(charc,DataOutputStreamwriter)throwsIOException{writer.writeChar(c);writer.writeInt(1);writer.writeInt(2);writer.writeInt(3);writer.flush();}//*******************等待服务器消息的线程************************staticclassWaitForMsgextendsThread{privatestaticSocketsocket;privatestaticDataInputStreamin;publicWaitForMsg(Socketsocket){try{this.socket=socket;in=newDataInputStream(socket.getInputStream());}catch(IOExceptionioe){//连接已关闭ioe.printStackTrace();}}publicvoidrun(){try{while(!isOver){if(in.available()>0){System.out.println("输入流可读");charhead=in.readChar();int[]rdata=newint[3];rdata[0]=in.readInt();rdata[1]=in.readInt();rdata[2]=in.readInt();data.add(head);for(inti=0;i<rdata.length;i++){data.add(rdata[i]);}isWait=false;}}}catch(IOExceptionioe){ioe.printStackTrace();return;}}}}