父亲和儿子带着小狗去野外旅游。因为父亲有事,所以儿子带着小狗先走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;
}
}
}