你的姓名——《Java语言》课程作业(第二次)1一、课程题目利用UDP网络编程,编写程序在本机构造一个时间服务器,客户端利用UDP数据报取得服务器上的时间。(掌握利用DatagramSocket和DatagramPacket进行UDP网络编程)二、题目分析与设计1、本题要求服务器端可以根据客户端的请求返回带有服务器时间信息的数据报。使用UDP协议传输。2、本程序功能较少。分为服务器端的窗体界面和客户端窗体界面。其中服务器端界面包括实时时间显示和传输历史记录以及服务开关三部分。客户端分为时间显示及同步开关两部分。3、说明:用户发送请求消息,客户端进入等待状态。若收到服务端返回的消息,则打印并显示给用户。否则重新请求数据。服务端进行循环监听,若监听到请求消息,则向发送方返回时间信息。你的姓名——《Java语言》课程作业(第二次)24、该程序在Eclipse下编写。关键部分为socket获取的构建:getSocket.setSoTimeout(5000);//超时getSocket.receive(getPacket);//监听消息函数getMes=newString(buf,0,getPacket.getLength());//收到消息//由frm处理消息,并取得feedback消息Stringfeedback=this.frm.socketMessage(getMes,getPacket);sendAddress=getPacket.getSocketAddress();//获取发送方地址byte[]backBuf=feedback.getBytes();DatagramPacketsendPacket=newDatagramPacket(backBuf,backBuf.length,sendAddress);//构造返回DatagranPacketgetSocket.send(sendPacket);//发送三、测试分析经测试该程序服务端能够接受客户端的请求返回事件消息。并支持多终端。你的姓名——《Java语言》课程作业(第二次)3附录:源代码//以下代码属于服务端importjava.awt.Color;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowEvent;importjava.awt.event.WindowListener;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketAddress;importjava.net.SocketException;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Timer;importjava.util.TimerTask;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassReceive{publicstaticvoidmain(String[]args){mainFramefrm=newmainFrame(100,100,300,550);}}//窗体类classmainFrameextendsJFrameimplementsActionListener{privateJButtonbtn1;//服务开关按钮privateJTextFieldtxt1;//显示时间privateJTextAreamsgList;//操作历史记录privateJScrollPanejsp;privateintHeight=200,Width=300,Left=100,Top=100;privateSimpleDateFormatdateFormat=newSimpleDateFormat(yyyy/MM/ddHH:mm:ss);privateTimertimer1=newTimer();//实时更行时间并显示privatesocketsck;mainFrame(){你的姓名——《Java语言》课程作业(第二次)4//this.setLayout(newFlowLayout(FlowLayout.CENTER));StringTime=dateFormat.format(newDate());JLabellabel1=newJLabel(现在时间:);this.setLayout(null);this.setVisible(true);this.setLocation(Left,Top);this.setSize(Width,Height);this.setTitle(Server);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//接管窗体关闭消息label1.setBounds(20,20,100,20);btn1=newJButton(服务已启动);btn1.setBounds(20,50,100,20);btn1.addActionListener(this);txt1=newJTextField(Time);txt1.setBounds(100,20,160,20);txt1.setEditable(false);txt1.setBackground(Color.white);msgList=newJTextArea(服务已启动\n);msgList.setEditable(false);msgList.setBackground(Color.white);jsp=newJScrollPane(msgList);jsp.setVisible(true);jsp.setBounds(20,90,this.Width-50,this.Height-140);add(btn1);add(txt1);add(label1);add(jsp);sck=newsocket(this,8888);//使用另一个线程监听请求sck.start();//sck.run();timer1.schedule(newTimerTask(){//获取时间@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubtxt1.setText(dateFormat.format(newDate()));}},1000,1000);}mainFrame(intLeft,intTop,intWidth,intHeight){//重载构造函数,你的姓名——《Java语言》课程作业(第二次)5修改窗体大小this();this.Left=Left;this.Top=Top;this.Width=Width;this.Height=Height;this.setBounds(Left,Top,Width,Height);jsp.setBounds(20,90,this.Width-50,this.Height-140);}publicvoidaddMsgList(Stringmsg){//添加操作历史记录msgList.append(msg+\n);msgList.setSelectionStart(msgList.getText().length());}publicStringsocketMessage(Stringmessage,DatagramPacketPacket){//消息处理函数,这里默认直接返回时间消息。System.out.println(ReceivedMsg:+message);addMsgList(收到请求消息:+message);InetAddresssendIP=Packet.getAddress();intsendPort=Packet.getPort();System.out.println(对方的IP地址是:+sendIP.getHostAddress());System.out.println(对方的端口号是:+sendPort);addMsgList(对方的IP地址是:+sendIP.getHostAddress());addMsgList(对方的端口号是:+sendPort);//直接回复txt1的时间消息addMsgList(已回复消息:+txt1.getText().toString()+\n);returnthis.txt1.getText().toString();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==btn1){if(sck.isStopThread()){sck.resumeThread();btn1.setLabel(服务已启动);addMsgList(服务已启动);}else{sck.stopThread();btn1.setLabel(服务已停止);addMsgList(服务已停止);你的姓名——《Java语言》课程作业(第二次)6}}}}classsocketextendsThread{//监听线程privateInetAddressip;privateintport;privatemainFramefrm;privateDatagramSocketgetSocket;privateDatagramPacketgetPacket;privatebyte[]buf;privatevolatilebooleanflag;socket(mainFramefrm,intport){//frm回调窗体this.frm=frm;this.port=port;try{//构造DatagramPacketip=InetAddress.getLocalHost();getSocket=newDatagramSocket(port,ip);buf=newbyte[1024];getPacket=newDatagramPacket(buf,buf.length);}catch(SocketExceptione){System.out.println(e.toString());}catch(Exceptione){System.out.println(e.toString());}}publicvoidstopThread(){//停止监听flag=true;}publicvoidresumeThread(){//恢复监听flag=false;}publicbooleanisStopThread(){//获取监听状态returnflag;}publicvoidrun(){StringgetMes;InetAddresssendIP;intsendPort;SocketAddresssendAddress;你的姓名——《Java语言》课程作业(第二次)7flag=false;while(true){while(!flag){try{System.out.println(Ready...);frm.addMsgList(正在监听消息...);getSocket.setSoTimeout(5000);//超时getSocket.receive(getPacket);//监听消息函数getMes=newString(buf,0,getPacket.getLength());//收到消息//由frm处理消息,并取