父亲和儿子带着小狗去野外旅游。因为父亲有事,所以儿子带着小狗先走10分钟。在这10分钟里,儿子和小狗的速度均为80米/分钟。在10分钟后及父亲追上儿子之前,儿子以两种速度交替前进,即先以160米/分钟的速度小跑10分钟,再以80米/分钟走10分钟。在这10分钟后及父亲追上儿子之前,父亲也开始出发,同样也以两种速度交替前进,即先以75米/分钟走10分钟,再以200米/分钟的速度小跑10分钟。在10分钟后及父亲追上儿子之前,小狗则开始以500米/分钟的速度往返于父亲与儿子之间。当父亲追上儿子之后,儿子、父亲和小狗一同以75米/分钟前进。要求由程序的参数指定儿子出发后的分钟数,程序计算并输出这时儿子、父亲和小狗离开家的距离,行进的方向和速度以及小狗在儿子和父亲之间往返的次数。
package 小狗来回跑;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
public class Client {
	public static void main(String args[])
	{
		new ComputerClient();
	}
}
class ComputerClient extends Frame implements Runnable,ActionListener
{
	Button connection,send;//定义连接,发送按钮
	//定义文本框
	TextField inputText,showResult1,showResult2,showResult3,showResult4,showResult5,showResult6,showResult7;
	Socket socket=null;//尽早将对象设置为null,
	DataInputStream in=null;//可以方便在垃圾回收器回收时直接回收掉为null变量先前引用的对象,
	DataOutputStream out=null;//可以方便在垃圾回收器回收时直接回收掉为null变量先前引用的对象,
	Thread thread;//定义线程
    ComputerClient()
	{
		socket=new Socket();//创建一个Socket对象
		setLayout(new FlowLayout());//设置布局
		Box box=Box.createVerticalBox();//创建列式盒式容器
		connection=new Button("连接服务器");//设置连接的按钮名称
		send=new Button("发送");//设置发送按钮名称
		send.setEnabled(false);//设置在服务器没连通时发送按钮不可用
		inputText=new TextField(12);//创建文本框,下同
		showResult1=new TextField(12);
		showResult2=new TextField(12);
		showResult3=new TextField(12);
		showResult4=new TextField(12);
		showResult5=new TextField(12);
		showResult6=new TextField(12);
		showResult7=new TextField(12);
		showResult1.setEditable(false);//设置不可编辑状态
		showResult2.setEditable(false);//设置不可编辑状态
		showResult3.setEditable(false);//设置不可编辑状态
		showResult4.setEditable(false);//设置不可编辑状态
		showResult5.setEditable(false);//设置不可编辑状态
		showResult6.setEditable(false);//设置不可编辑状态
		showResult7.setEditable(false);//设置不可编辑状态
		box.add(connection);//增加标签,同下
		box.add(new Label("输入时间"));
		box.add(inputText);
		box.add(send);
		box.add(new Label("父亲离家的距离:"));
		box.add(showResult1);
		box.add(new Label("儿子离家的距离:"));
		box.add(showResult2);
		box.add(new Label("小狗离家的距离:"));
		box.add(showResult3);
		box.add(new Label("父亲此时的速度:"));
		box.add(showResult4);
		box.add(new Label("儿子此时的速度:"));
		box.add(showResult5);
		box.add(new Label("小狗此时的方向:"));
		box.add(showResult6);
		box.add(new Label("小狗的返回次数:"));
		box.add(showResult7);
		connection.addActionListener(this);//connection将自身注册为自己的监视器
		send.addActionListener(this);//send将自身注册为自己的监视器
		thread=new Thread(this);//线程本身作为目标对象
		add(box);//增添盒式容器
		setBounds(10,30,300,500);//设置窗口在屏幕上的位置及大小
		setVisible(true);//设置窗口可见
		validate();//使容器再次布置其子组件
		addWindowListener(new WindowAdapter()//添加一个窗口监听
				{
			public void windowClosing(WindowEvent e)//这是窗口关闭事件
			{
				System.exit(0);//退出
			}
				});				
	}
	public void actionPerformed(ActionEvent e)//覆写动作方法
	{
		if(e.getSource()==connection)//调用事件源的getSource()方法就能获得注册的这个对象
		{
			try//请求和服务器建立套接字连接
			{
				if(socket.isConnected())//Socket对象如果连接成功
				{}
				else
				{
					InetAddress address=InetAddress.getByName("127.0.0.1");//获取IP地址
					InetSocketAddress socketAddress=new InetSocketAddress(address,4331);//获取地址和端口号
					socket.connect(socketAddress);//发出呼叫
					in=new DataInputStream(socket.getInputStream()); //获取输入流
					out=new DataOutputStream(socket.getOutputStream());//获取输出流
					send.setEnabled(true);//设置在服务器连通时发送按钮可用
					thread.start();//启动线程
				}
			}
			catch(IOException ee) {}
		}
		if(e.getSource()==send)//调用事件源的getSource()方法就能获得注册的这个对象
		{
			try {
				out.writeUTF(inputText.getText());//手动输入时间			
 		}
			catch(IOException e1){}		
		}
	}
	public void run()
	{
		String a=null;
		String b=null;
		String c=null;
		String d=null;
		String e=null;
		String f=null;
		String g=null;
			try{
				a=in.readUTF();
				showResult2.setText(a);//儿子离家距离
				b=in.readUTF();
				showResult5.setText(b);//儿子此时的速度
				c=in.readUTF();
				showResult1.setText(c);//父亲离家的距离
				d=in.readUTF();
				showResult4.setText(d);//父亲此时的速度
				e=in.readUTF();
				showResult3.setText(e);//父亲离家的距离
				f=in.readUTF();
				showResult6.setText(f);//父亲此时的速度
				g=in.readUTF();
				showResult7.setText(g);//父亲此时的速度
				 System.out.println("儿子离家距离是:"+a+"米");
				    System.out.println("儿子的速度是:"+b+"米每分钟");
				    System.out.println("儿子的方向是:正向的");
				    System.out.println("父亲的离家距离是:"+c+"米");
				    System.out.println("父亲的速度是"+d+"米每分钟");
			}
			catch(IOException e1)
			{
				showResult1.setText("与服务器已断开连接");
			}
		}
}



package 小狗来回跑;
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
	public static void main(String args[]) {
	ServerSocket server=null;
	Server_thread thread;//定义线程
	Socket you=null;
	while(true)
	{
		try { 
		server=new ServerSocket(4331);   //创建端口号 
	    }
		catch(IOException e1)
		{
			System.out.println("正在监听");//ServerSocket对象不能重复创建
		}
		try {
			System.out.println("等待客户呼叫");
			you=server.accept();//将客户端和服务器套接字连接
			System.out.println("客户的地址:"+you.getInetAddress());
		}
		catch(IOException e)
		{
			System.out.println("正在等待客户");
		}
		if(you!=null)
		{
			new Server_thread(you).start();//为每个客户启动一个专门的线程
		}
	 }
   }
}
class Server_thread extends Thread
{
	Socket socket;//对象组合,委托
	DataOutputStream out=null;
	DataInputStream in=null;
	String s=null;
	boolean quesion=false;//初始化
	Server_thread(Socket t)//构造方法
	{
		socket=t;
		try {
			out=new DataOutputStream(socket.getOutputStream());
			in=new DataInputStream(socket.getInputStream());
		}
		catch (IOException e){}
	}
	public void A() throws IOException
	{
		int time=0;
		try {
			out=new DataOutputStream(socket.getOutputStream());
			in=new DataInputStream(socket.getInputStream());
		} catch (IOException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		
		double sFather = 0;//爸爸离家的距离
	    double sSon =0;//儿子离家的距离
	    double sDog =0;//小狗离家的距离
	    int flg = -1;//小狗跑的方向,朝爸爸为-1,朝儿子为1
	    boolean father=true;
	    int t = 1;//时间的循环变量,以一秒为单位4
	    int cnt = 0;//小狗在爸爸跟儿子间来回的次数
	    double vFather=0;
	    double vSon=0;
	    double vDog=500;
	    try {
			time=Integer.parseInt(in.readUTF());//读取时间
		} catch (NumberFormatException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	     if(600<(time*60)&&(time*60)<=3475)
	     {
	    	 time=time-10;
	    	 sSon+=800;
	 	    sDog+=800;
	    while(t <= time*60){
	        vFather = (double)75/60;//1秒的速度
	        vSon = (double)80/60;//1秒的速度
	        if(t % (20*60) > (10*60)){
	            vFather = (double)200/60;//1秒的速度
	            vSon = (double)160/60;//1秒的速度
	        }
	        sFather += vFather;
	        father=true;
	        sSon += vSon;
	        sDog += flg * 500/(double)60;//加小狗1秒的速度
	        t++;
	        if(sFather >= sDog) {flg = 1; cnt++;}
	        if(sSon <= sDog) {flg = -1; cnt++;}	    
	    }
	    vSon=vSon*60;
	    vFather*=60;	    	     	    
	     }
	     else if(time<=10)
	     {
	    	 sSon=80*time;
	    	 sFather=0;
	    	 sDog=sSon;
	    	 father=false;
	    	 vSon=80;
	    	 vDog=vSon;
	    	 vFather=0;
	    	 flg=1;	    	 
	     }
	     else
	     {
	     sSon=7833.3+(60*time-3475)*75;
    	 sFather=sSon;
    	 sDog=sSon;
    	 father=true;
    	 vSon=75;
    	 vDog=vSon;
    	 vFather=75;
    	 flg=1;
    	 cnt=82;
	     }
	    System.out.println("儿子离家距离是:"+sSon+"米");
	    System.out.println("儿子的速度是:"+vSon+"米每分钟");
	    System.out.println("儿子的方向是:正向的");
	    System.out.println("父亲的离家距离是:"+sFather+"米");
	    System.out.println("父亲的速度是"+vFather+"米每分钟");
	    String str1 = String.valueOf(sSon); 
	    String str2 = String.valueOf(vSon); 
	    String str3 = String.valueOf(sFather); 
	    String str4 = String.valueOf(vFather);  
		    try {
				out.writeUTF(str1);
				out.writeUTF(str2);
				out.writeUTF(str3);
				out.writeUTF(str4);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	     if(father)
	         System.out.println("父亲的方向是:正向的");
	     else
	    	 System.out.println("父亲此时无方向");
	     System.out.println("小狗的离家距离是:"+sDog+"米");
	     System.out.println("小狗的速度是:"+vDog+"米每分钟");
	     String str5 =String.valueOf(sDog);    
	     try {
	    	 out.writeUTF(str5);
	    	
	         }
	     catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	     if(flg==1)
	     {
	    	 System.out.println("小狗的方向是正向的");
	    	 String str6 ="正向";
	    	 out.writeUTF(str6);
	     }
	     else
	     {
	    	 System.out.println("小狗的方向是反向的");
	    	 String str6 ="反向";
	    	 out.writeUTF(str6);
	     }
	     System.out.println("小狗往返的次数是"+cnt+"次");
	     String str7 =String.valueOf(cnt); 
	     out.writeUTF(str7);
	}
	public void run()
		{		
			try {
				try {
					A();
				}
				catch(NumberFormatException e)
				{
					out.writeUTF("请输入数字字符");
				}			
			}
			catch(IOException e)
			{
				System.out.println("客户离开");
				return;
			}
		}
   }