[JAVA] 基于TCP的起重机运行模拟器

1、客户端

  1 package ClientMain;
  2
  3 import java.io.DataInputStream;
  4 import java.io.DataOutputStream;
  5 import java.io.IOException;
  6 import java.net.InetAddress;
  7 import java.net.Socket;
  8 import java.text.SimpleDateFormat;
  9 import java.util.Date;
 10 import java.util.Scanner;
 11
 12 public class TcpClient {
 13     public static void main(String[] args) throws IOException {
 14         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
 15         Socket s = null;
 16         DataInputStream DataIn = null;
 17         DataOutputStream DataOut = null;
 18         try {
 19             // s=new Socket(InetAddress.getByName("192.168.1.130"),8000);
 20             s = new Socket("localhost", 8000);
 21             DataIn = new DataInputStream(s.getInputStream());
 22             DataOut = new DataOutputStream(s.getOutputStream());
 23             System.out.println("连接成功");
 24             @SuppressWarnings("resource")
 25             Scanner keyIn = new Scanner(System.in);
 26             while (keyIn.hasNext()) {
 27                 String c = keyIn.nextLine();
 28                 System.out.println("输入命令为: " + c);
 29                 if (c.length() == 0)
 30                     continue;
 31                 char inputchar = c.charAt(0);// 输入命令取字符串的第一个
 32                 switch (inputchar) {
 33                 case ‘a‘:
 34                     DataOut.writeByte(inputchar);
 35                     System.out.println(df.format(new Date()) + " : 执行大车前移命令");// 服务器日志信息
 36                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 37                     break;// 大车前移命令
 38                 case ‘b‘:
 39                     DataOut.writeByte(inputchar);
 40                     System.out.println(df.format(new Date()) + " : 执行大车后移命令");// 服务器日志信息
 41                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 42                     break;// 大车后移命令
 43                 case ‘c‘:
 44                     DataOut.writeByte(inputchar);
 45                     System.out.println(df.format(new Date()) + " : 执行大车停止命令");// 服务器日志信息
 46                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 47                     break;// 大车停止命令
 48                 case ‘d‘:
 49                     DataOut.writeByte(inputchar);
 50                     System.out.println(df.format(new Date()) + " : 执行小车前移命令");// 服务器日志信息
 51                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 52                     break;// 小车前移命令
 53                 case ‘e‘:
 54                     DataOut.writeByte(inputchar);
 55                     System.out.println(df.format(new Date()) + " : 执行小车后移命令");// 服务器日志信息
 56                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 57                     break;// 小车后移命令
 58                 case ‘f‘:
 59                     DataOut.writeByte(inputchar);
 60                     System.out.println(df.format(new Date()) + " : 执行小车停止命令");// 服务器日志信息
 61                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 62                     break;// 小车停止命令
 63                 case ‘g‘:
 64                     DataOut.writeByte(inputchar);
 65                     System.out.println(df.format(new Date()) + " : 执行吊钩上移命令");// 服务器日志信息
 66                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 67                     break;// 吊钩上移命令
 68                 case ‘h‘:
 69                     DataOut.writeByte(inputchar);
 70                     System.out.println(df.format(new Date()) + " : 执行吊钩下移命令");// 服务器日志信息
 71                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 72                     break;// 吊钩下移命令
 73                 case ‘i‘:
 74                     DataOut.writeByte(inputchar);
 75                     System.out.println(df.format(new Date()) + " : 执行吊钩停止命令");// 服务器日志信息
 76                     System.out.println("服务器返回数据: " + (char) DataIn.readByte());
 77                     break;// 吊钩停止命令
 78                 case ‘j‘:
 79                     DataOut.writeByte(inputchar);
 80                     System.out.println(df.format(new Date()) + " : 执行获取大车位置命令");// 服务器日志信息
 81                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
 82                             + (char) DataIn.readByte()
 83                             + (char) DataIn.readByte()
 84                             + (char) DataIn.readByte()
 85                             + (char) DataIn.readByte()
 86                             + (char) DataIn.readByte());
 87                     break;// 获取大车位置
 88                 case ‘k‘:
 89                     DataOut.writeByte(inputchar);
 90                     System.out.println(df.format(new Date()) + " : 执行获取小车位置命令");// 服务器日志信息
 91                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
 92                             + (char) DataIn.readByte()
 93                             + (char) DataIn.readByte()
 94                             + (char) DataIn.readByte()
 95                             + (char) DataIn.readByte()
 96                             + (char) DataIn.readByte());
 97                     break;// 获取小车位置
 98                 case ‘l‘:
 99                     DataOut.writeByte(inputchar);
100                     System.out.println(df.format(new Date()) + " : 执行获取吊钩位置命令");// 服务器日志信息
101                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
102                             + (char) DataIn.readByte()
103                             + (char) DataIn.readByte()
104                             + (char) DataIn.readByte()
105                             + (char) DataIn.readByte()
106                             + (char) DataIn.readByte());
107                     break;// 获取吊钩位置
108                 case ‘m‘:
109                     DataOut.writeByte(inputchar);
110                     System.out.println(df.format(new Date()) + " : 执行获取大车速度命令");// 服务器日志信息
111                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
112                             + (char) DataIn.readByte()
113                             + (char) DataIn.readByte());
114                     break;// 获取大车速度
115                 case ‘n‘:
116                     DataOut.writeByte(inputchar);
117                     System.out.println(df.format(new Date()) + " : 执行获取小车速度命令");// 服务器日志信息
118                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
119                             + (char) DataIn.readByte()
120                             + (char) DataIn.readByte());
121                     break;// 获取小车速度
122                 case ‘o‘:
123                     DataOut.writeByte(inputchar);
124                     System.out.println(df.format(new Date()) + " : 执行获取吊钩速度命令");// 服务器日志信息
125                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
126                             + (char) DataIn.readByte()
127                             + (char) DataIn.readByte());
128                     break;// 获取吊钩速度
129                 case ‘p‘:
130                     DataOut.writeByte(inputchar);
131                     System.out.println(df.format(new Date()) + " : 执行获取重物重量命令");// 服务器日志信息
132                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
133                             + (char) DataIn.readByte()
134                             + (char) DataIn.readByte()
135                             + (char) DataIn.readByte()
136                             + (char) DataIn.readByte()
137                             + (char) DataIn.readByte());
138                     break;// 获取重物重量
139                 case ‘q‘:
140                     DataOut.writeByte(inputchar);
141                     System.out.println(df.format(new Date())
142                             + " : 执行获取机器本次工作时间命令");// 服务器日志信息
143                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
144                             + (char) DataIn.readByte()
145                             + (char) DataIn.readByte()
146                             + (char) DataIn.readByte()
147                             + (char) DataIn.readByte()
148                             + (char) DataIn.readByte());
149                     break;// 获取机器本次工作时间
150                 case ‘r‘:
151                     DataOut.writeByte(inputchar);
152                     System.out.println(df.format(new Date())
153                             + " : 执行获取机器总工作次数命令");// 服务器日志信息
154                     System.out.println("服务器返回数据: " + (char) DataIn.readByte()
155                             + (char) DataIn.readByte()
156                             + (char) DataIn.readByte()
157                             + (char) DataIn.readByte()
158                             + (char) DataIn.readByte()
159                             + (char) DataIn.readByte());
160                     break;// 获取机器总工作次数
161                 case ‘s‘:// [留待以后扩展]
162                     DataOut.writeByte(inputchar);
163                     System.out.println(df.format(new Date())
164                             + " : 执行获取机器工作状态命令");// 服务器日志信息
165                     break;// 获取机器工作状态
166                 default:
167                     System.out.println(df.format(new Date()) + " : 输入命令有误!");// 服务器日志信息
168                     break;// 错误操作
169                 }
170             }
171             DataIn.close();
172             DataOut.close();
173             s.close();
174         } catch (IOException e) {
175             // TODO Auto-generated catch block
176             e.printStackTrace();
177         }
178         DataIn.close();
179         DataOut.close();
180         s.close();
181     }
182 }

TcpClient.java



2、服务器

  1 package ServerMain;
  2
  3 import java.awt.Graphics2D;
  4
  5 public class Qzj {
  6     public static final int GO = 1, BACK = -1, STOP = 0;// 3种运动状态
  7     public Car big, small, hook;// 声明大车,小车和吊钩
  8     public int weight;// 称重重量[0-99999kg]
  9     public int all_work_times;// 总工作次数[0-99999次]
 10     public int this_time;// 本次工作时长[0-99999分钟]
 11     public int work_state;// 机器工作状态[留待]
 12
 13     Qzj() {// 这里偷下懒,一口气把所有参数写进来太麻烦干脆直接在这里修改吧
 14         big = new Car(5000, 5, STOP, 0, 10000, 500, 9500, 8);// 大车初始位置为50米处,速度为5dm/s,停止状态,没有警报,轨道100m,左右限位,最大速度为8dm/s
 15         small = new Car(100, 2, STOP, 0, 2000, 100, 1900, 5);
 16         hook = new Car(0, -2, STOP, 0, 1000, 50, 950, 4);
 17         weight = new java.util.Random().nextInt() % 100000;
 18         all_work_times = new java.util.Random().nextInt() % 100000;
 19         this_time = new java.util.Random().nextInt() % 100000;
 20         work_state = 0;
 21
 22         Thread t1 = new Thread(big);
 23         Thread t2 = new Thread(small);
 24         Thread t3 = new Thread(hook);
 25
 26         t1.start();
 27         t2.start();
 28         t3.start();
 29     }
 30
 31     public class Car implements Runnable {
 32         public int position;// 当前车的位置0-99999cm
 33         public int speed;// 当前车的速度0-99dm/s
 34         public int state;// 当前车的运动状态[GO,BACK,STOP]
 35         public int warn;// 当前车是否有限位报警[留待]
 36         public int length, limit_Lposition, limit_Rposition, limit_speed;// 轨道长度,左限位,右限位[cm],限速[dm/s]
 37
 38         Car(int pos, int spe, int sta, int war, int len, int limit_Lpos,
 39                 int limit_Rpos, int limit_spe) {
 40             position = pos;
 41             speed = spe;
 42             state = sta;
 43             warn = war;
 44             length = len;
 45             limit_Lposition = limit_Lpos;
 46             limit_Rposition = limit_Rpos;
 47             limit_speed = limit_spe;
 48         }// 构造函数
 49
 50         //将信息显示到屏幕上
 51         public void showText(Graphics2D gg,int x,int y) {
 52             gg.drawString("$: 实时信息---位置: "+position+" cm, 速度: "+speed+" dm/s, 状态: "+state+" , 警报: "+warn+" , 轨长: "+length+" cm, 左限位: "+limit_Lposition+" cm, 右限位: "+limit_Rposition+" cm, 限速"+limit_speed+" dm/s",x,y);
 53         }
 54         // //获取参数函数系
 55
 56         void setPos(int pos) {
 57             position = pos;
 58         }
 59
 60         void setSpe(int spe) {
 61             speed = spe;
 62         }
 63
 64         void setSta(int sta) {
 65             state = sta;
 66         }
 67
 68         void setWar(int war) {
 69             warn = war;
 70         }
 71
 72         void setLen(int len) {
 73             length = len;
 74         }
 75
 76         void setLimit_Lpos(int limit_Lpos) {
 77             limit_Lposition = limit_Lpos;
 78         }
 79
 80         void setLimit_Rpos(int limit_Rpos) {
 81             limit_Rposition = limit_Rpos;
 82         }
 83
 84         void setLimit_spe(int limit_spe) {
 85             limit_speed = limit_spe;
 86         }
 87
 88         // //
 89
 90         // //设置参数函数系
 91         int getPos() {
 92             return position;
 93         }
 94
 95         int getSpe() {
 96             return speed;
 97         }
 98
 99         int getSta() {
100             return state;
101         }
102
103         int getWar() {
104             return warn;
105         }
106
107         int getLen() {
108             return length;
109         }
110
111         int getLimit_Lpos() {
112             return limit_Lposition;
113         }
114
115         int getLimit_Rpos() {
116             return limit_Rposition;
117         }
118
119         int getLimit_spe() {
120             return limit_speed;
121         }
122
123         // //
124         @Override
125         public void run() {// 车运动的线程函数
126             while (true) {
127                 switch (state) {// 运动处理
128                 case GO:
129                     position += speed*10;//单位转换,因为速度是dm/s其他的是cm为单位
130                     break;
131                 case BACK:
132                     position -= speed*10;//单位转换
133                     break;
134                 case STOP:
135                     break;
136                 default:
137                     break;
138                 }
139                 // 限位报警处理
140                 if (position > limit_Rposition) {// 超出右限位,停在右限位
141                     position = limit_Rposition;
142                     state = STOP;
143                 } else if (position < limit_Lposition) {// 超出左限位,停在左限位
144                     position = limit_Lposition;
145                     state = STOP;
146                 }
147                 // 等待时间
148                 try {
149                     Thread.sleep(500);
150                 } catch (InterruptedException e) {
151                     // TODO Auto-generated catch block
152                     e.printStackTrace();
153                 }
154             }
155         }
156     }
157 }

Qzj.java

>_<" 起重机类,这里将大车,小车,勾用类Car来实现,然后分别声明(因为他们有相似点);至于起重机其他参数就在QZJ的类里面声明~

  1 package ServerMain;
  2
  3 import java.io.DataInputStream;
  4 import java.io.DataOutputStream;
  5 import java.io.IOException;
  6 import java.net.ServerSocket;
  7 import java.net.Socket;
  8 import java.text.SimpleDateFormat;
  9 import java.util.Date;
 10
 11 public class TcpServer {
 12
 13     public static Qzj qzj = new Qzj();// 实例化一个起重机的类
 14     public static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
 15     // System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
 16     public static ServerSocket server;
 17     public static Socket s = null;
 18     public static DataOutputStream dataOut = null;
 19     public static DataInputStream dataIn = null;
 20
 21     public TcpServer() throws IOException{
 22         server = new ServerSocket(8000);
 23         getandsend mes = new getandsend();
 24         Thread t1 = new Thread(mes);
 25         t1.start();
 26     }
 27
 28     public class getandsend implements Runnable {
 29         public void run() {
 30             while (true) {
 31                 try {
 32                     s = server.accept();
 33                     dataOut = new DataOutputStream(s.getOutputStream());
 34                     dataIn = new DataInputStream(s.getInputStream());
 35                     while (true) {
 36                         Byte c = dataIn.readByte();
 37                         switch (c) {
 38                         case ‘a‘:
 39                             dataOut.writeByte(‘a‘);
 40                             qzj.big.state=Qzj.GO;
 41                             System.out.println(df.format(new Date())
 42                                     + " : 执行大车前移命令");// 服务器日志信息
 43                             break;// 大车前移命令
 44                         case ‘b‘:
 45                             dataOut.writeByte(‘b‘);
 46                             qzj.big.state=Qzj.BACK;
 47                             System.out.println(df.format(new Date())
 48                                     + " : 执行大车后移命令");// 服务器日志信息
 49                             break;// 大车后移命令
 50                         case ‘c‘:
 51                             dataOut.writeByte(‘c‘);
 52                             qzj.big.state=Qzj.STOP;
 53                             System.out.println(df.format(new Date())
 54                                     + " : 执行大车停止命令");// 服务器日志信息
 55                             break;// 大车停止命令
 56                         case ‘d‘:
 57                             dataOut.writeByte(‘d‘);
 58                             qzj.small.state=Qzj.GO;
 59                             System.out.println(df.format(new Date())
 60                                     + " : 执行小车前移命令");// 服务器日志信息
 61                             break;// 小车前移命令
 62                         case ‘e‘:
 63                             dataOut.writeByte(‘e‘);
 64                             qzj.small.state=Qzj.BACK;
 65                             System.out.println(df.format(new Date())
 66                                     + " : 执行小车后移命令");// 服务器日志信息
 67                             break;// 小车后移命令
 68                         case ‘f‘:
 69                             dataOut.writeByte(‘f‘);
 70                             qzj.small.state=Qzj.STOP;
 71                             System.out.println(df.format(new Date())
 72                                     + " : 执行小车停止命令");// 服务器日志信息
 73                             break;// 小车停止命令
 74                         case ‘g‘:
 75                             dataOut.writeByte(‘g‘);
 76                             qzj.hook.state=Qzj.GO;
 77                             System.out.println(df.format(new Date())
 78                                     + " : 执行吊钩上移命令");// 服务器日志信息
 79                             break;// 吊钩上移命令
 80                         case ‘h‘:
 81                             dataOut.writeByte(‘h‘);
 82                             qzj.hook.state=Qzj.BACK;
 83                             System.out.println(df.format(new Date())
 84                                     + " : 执行吊钩下移命令");// 服务器日志信息
 85                             break;// 吊钩下移命令
 86                         case ‘i‘:
 87                             dataOut.writeByte(‘i‘);
 88                             qzj.hook.state=Qzj.STOP;
 89                             System.out.println(df.format(new Date())
 90                                     + " : 执行吊钩停止命令");// 服务器日志信息
 91                             break;// 吊钩停止命令
 92                         case ‘j‘:
 93                             sendstring(dataOut, qzj.big.getPos(), 6, ‘j‘);
 94                             System.out.println(df.format(new Date())
 95                                     + " : 执行获取大车位置命令");// 服务器日志信息
 96                             break;// 获取大车位置
 97                         case ‘k‘:
 98                             sendstring(dataOut, qzj.small.getPos(), 6, ‘k‘);
 99                             System.out.println(df.format(new Date())
100                                     + " : 执行获取小车位置命令");// 服务器日志信息
101                             break;// 获取小车位置
102                         case ‘l‘:
103                             sendstring(dataOut, qzj.hook.getPos(), 6, ‘l‘);
104                             System.out.println(df.format(new Date())
105                                     + " : 执行获取吊钩位置命令");// 服务器日志信息
106                             break;// 获取吊钩位置
107                         case ‘m‘:
108                             sendstring(dataOut, qzj.big.getSpe(), 3, ‘m‘);
109                             System.out.println(df.format(new Date())
110                                     + " : 执行获取大车速度命令");// 服务器日志信息
111                             break;// 获取大车速度
112                         case ‘n‘:
113                             sendstring(dataOut, qzj.small.getSpe(), 3, ‘n‘);
114                             System.out.println(df.format(new Date())
115                                     + " : 执行获取小车速度命令");// 服务器日志信息
116                             break;// 获取小车速度
117                         case ‘o‘:
118                             sendstring(dataOut, qzj.hook.getSpe(), 3, ‘o‘);
119                             System.out.println(df.format(new Date())
120                                     + " : 执行获取吊钩速度命令");// 服务器日志信息
121                             break;// 获取吊钩速度
122                         case ‘p‘:
123                             sendstring(dataOut, qzj.weight, 6, ‘p‘);
124                             System.out.println(df.format(new Date())
125                                     + " : 执行获取重物重量命令");// 服务器日志信息
126                             break;// 获取重物重量
127                         case ‘q‘:
128                             sendstring(dataOut, qzj.this_time, 6, ‘q‘);
129                             System.out.println(df.format(new Date())
130                                     + " : 执行获取机器本次工作时间命令");// 服务器日志信息
131                             break;// 获取机器本次工作时间
132                         case ‘r‘:
133                             sendstring(dataOut, qzj.all_work_times, 6, ‘r‘);
134                             System.out.println(df.format(new Date())
135                                     + " : 执行获取机器总工作次数命令");// 服务器日志信息
136                             break;// 获取机器总工作次数
137                         case ‘s‘:// [留待以后扩展]
138                             sendstring(dataOut, qzj.work_state, 6, ‘s‘);
139                             System.out.println(df.format(new Date())
140                                     + " : 执行获取机器工作状态命令");// 服务器日志信息
141                             break;// 获取机器工作状态
142                         default:
143                             break;// 错误操作
144                         }
145                     }
146                 } catch (IOException e) {
147                 }finally{
148                     try {
149                         dataOut.close();
150                         dataIn.close();
151                         s.close();
152                     } catch (IOException e) {
153                         e.printStackTrace();
154                     }
155                 }
156             }
157         }
158     }
159
160     // 将int类的data转换为i-1位字符串并加上c结尾发送出去函数
161     private static void sendstring(DataOutputStream dataOut, int data, int i,
162             char c) throws IOException {
163         switch (i) {
164         case 6:
165             dataOut.writeByte((char) (data / 10000 + ‘0‘));
166             data %= 10000;
167         case 5:
168             dataOut.writeByte((char) (data / 1000 + ‘0‘));
169             data %= 1000;
170         case 4:
171             dataOut.writeByte((char) (data / 100 + ‘0‘));
172             data %= 100;
173         case 3:
174             dataOut.writeByte((char) (data / 10 + ‘0‘));
175             data %= 10;
176         case 2:
177             dataOut.writeByte((char) (data + ‘0‘));
178         case 1:
179             dataOut.writeByte(c);
180         }
181     }
182
183     public static void main(String[] args) throws IOException {
184         new TcpServer();
185     }
186 }

TcpServer.java

>_<" TCP服务器,负责接收客户端命令和处理命令~

  1 package ServerMain;
  2
  3
  4 import javax.swing.*;
  5 import java.awt.*;
  6 import java.io.IOException;
  7
  8
  9 final class Draw extends JFrame implements Runnable {
 10
 11     public static TcpServer tcp;
 12
 13     Draw() throws HeadlessException, IOException {
 14         super();
 15         Container container = getContentPane();
 16         container.add(canvas, BorderLayout.CENTER);//把canvas加入中间
 17         pack();
 18         tcp=new TcpServer();//使命并实例化一个TCP服务器并启动
 19     }
 20
 21     private final static JComponent canvas = new JComponent() {
 22         protected void paintComponent(Graphics g) {
 23             super.paintComponent(g);
 24             drawQZJ(g);
 25             drawText(g);
 26         }
 27
 28         //http://www.weixueyuan.net/view/6074.html Graphics资料
 29         //绘制起重机3维图像
 30         private  int a=10,b=90,wid=600,len=380;//矩形框的位置和大小
 31         public void drawQZJ(Graphics g){
 32             Graphics2D gg=(Graphics2D)g;
 33             gg.setColor(Color.BLUE);
 34             gg.fillRect(0 , 0 , 800 , 480);
 35             gg.setColor(Color.YELLOW);
 36             gg.fillRect(a, b , wid, len);
 37             gg.setColor(Color.BLACK);
 38             gg.drawRect(a, b , wid, len);
 39             Stroke stroke=new BasicStroke(2.0f);//设置线宽为2.0
 40             gg.setStroke(stroke);
 41             gg.setColor(Color.BLACK);
 42             //最长横梁边距为15,间距为100
 43             gg.drawLine(a+15, b+15,wid+a-15, b+15);
 44             gg.drawLine(a+15, b+115,wid+a-15, b+115);
 45             //画大车,将位置经过比例运算展现,这里位置默认为大车中间位置,所以前后伸长25
 46             gg.drawLine(a+15-25+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(), b+5,a+15-25+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(), b+125);
 47             gg.drawLine(a+15+25+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(), b+5,a+15+25+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(), b+125);
 48             //画小车
 49             gg.setColor(Color.RED);
 50             gg.drawLine(a+15-25+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen()-10, b+15+tcp.qzj.small.getPos()*100/tcp.qzj.small.getLen(),a+15+25+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen()+10, b+15+tcp.qzj.small.getPos()*100/tcp.qzj.small.getLen());
 51             //画勾
 52             gg.setColor(Color.BLACK);
 53             gg.drawLine(a+15,b+175,wid+a-15,b+175);//横轨
 54             stroke=new BasicStroke(1.0f);//设置线宽为1.0
 55             gg.setStroke(stroke);
 56             gg.drawRect(a+15-4+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),b+175-4,8,6);//滑块8X6
 57             gg.drawLine(a+15+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),b+175+2,a+15+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),tcp.qzj.hook.getPos()*170/tcp.qzj.hook.getLen()+b+175+2);//中间的线
 58             gg.fillRect(a+15-3+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),tcp.qzj.hook.getPos()*170/tcp.qzj.hook.getLen()+b+175+2,7,6);//下面的小方块7X6
 59             gg.drawLine(a+15+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),tcp.qzj.hook.getPos()*170/tcp.qzj.hook.getLen()+b+175+2+6,a+15+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),tcp.qzj.hook.getPos()*170/tcp.qzj.hook.getLen()+b+175+2+6+3);//下面是画最下面的勾
 60             gg.drawRect(a+15-6+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),tcp.qzj.hook.getPos()*170/tcp.qzj.hook.getLen()+b+175+2+6+3,12,6);//负载12X6
 61             gg.setColor(Color.YELLOW);
 62             gg.fillRect(a+15-6-1+tcp.qzj.big.getPos()*(wid-30)/tcp.qzj.big.getLen(),tcp.qzj.hook.getPos()*170/tcp.qzj.hook.getLen()+b+175+2+6+3-1,7,4);//画一个黄色的矩形将上面的矩形变成一个勾
 63
 64         }
 65
 66         //显示起重机信息
 67         private void drawText(Graphics g) {
 68             Graphics2D gg=(Graphics2D)g;
 69             gg.setColor(Color.BLACK);
 70             //右边上部分显示起重机的整体运动实时参数
 71             gg.drawString("$ 称重重量: "+tcp.qzj.weight+" [kg]",620,100);//weight
 72             gg.drawString("$ 总工作次数: "+tcp.qzj.all_work_times+" [次]",620,120);//all_work_times
 73             gg.drawString("$ 本次工作时长: "+tcp.qzj.this_time+" [分钟]",620,140);//this_time
 74             gg.drawString("$ 机器工作状态: "+tcp.qzj.work_state+" [留待]",620,160);//work_state
 75             gg.drawLine(620, 165, 760, 165);
 76             //右下部分显示客户端TCP发送过来的控制命令
 77             gg.drawString("$ 大车前移命令: a",620,180);
 78             gg.drawString("$ 大车后移命令: b",620,195);
 79             gg.drawString("$ 大车停止命令: c",620,210);
 80             gg.drawString("$ 小车前移命令: d",620,225);
 81             gg.drawString("$ 小车后移命令: e",620,240);
 82             gg.drawString("$ 小车停止命令: f",620,255);
 83             gg.drawString("$ 吊钩上移命令: g",620,270);
 84             gg.drawString("$ 吊钩下移命令: h",620,285);
 85             gg.drawString("$ 吊钩停止命令: i",620,300);
 86             gg.drawString("$ 获取大车位置: j",620,315);
 87             gg.drawString("$ 获取小车位置: k",620,330);
 88             gg.drawString("$ 获取吊钩位置: l",620,345);
 89             gg.drawString("$ 获取大车速度: m",620,360);
 90             gg.drawString("$ 获取小车速度: n",620,375);
 91             gg.drawString("$ 获取吊钩速度: o",620,390);
 92             gg.drawString("$ 获取重物重量: p",620,405);
 93             gg.drawString("$ 本次工作时间: q",620,420);
 94             gg.drawString("$ 总的工作次数: r",620,435);
 95             gg.drawString("$ 获取工作状态: s",620,450);
 96             //上面一部分显示实时信息
 97             gg.drawString("$----嵌入式操作系统Java模拟机,第1.0版,2014-9-18-3:15----$",230,20);//标题
 98             tcp.qzj.big.showText(gg, 10, 50);
 99             tcp.qzj.small.showText(gg, 10, 65);
100             tcp.qzj.hook.showText(gg, 10, 80);
101
102         }
103
104     };//canvas
105
106     @Override
107     public void run() {//每隔一定时间进行绘制
108         while(true){
109             canvas.repaint();
110             try {
111                 Thread.sleep(100);
112             }catch (Exception e){}
113         }
114     }
115
116     public static void main(String[] args) throws IOException {
117         //绘图窗口实例化并启动刷新进程
118         Draw show=new Draw();
119         show.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
120         show.setSize(800,518);
121         show.setVisible(true);
122         Thread t2 = new Thread(show);
123         t2.start();
124     }
125 }

Draw.java

>_<" 负责绘制模拟起重机运动界面,实现模拟起重机的功能~



3、效果展示

>_<" 最终实现客户端在consoles里输入相应命令,然后通过TCP把数据传输至网络另一端的服务器,另一端的服务器根据不同的命令做出相应的回应及控制动作~这里运行的时候要先运行服务器部分,是draw文件,不是tcpserver文件,因为总的启动函数在draw中,客户端就直接运行但是要在服务器之后~(虽然这是最基本的知识了,但是还是要说一下~),此外每次调试的时候要先关闭客户端,再关闭服务器,如果一切正常启动服务器有错误,就检查一下consoles里是否服务器已经关闭(因为每次只能开一个服务器,没关闭上一个,端口就没有释放所以就报错)

[图1 服务器模拟端界面]

[图2 客户端Console部分]

[图3 服务器端consoles部分]



4、通信协议

时间: 2024-10-24 19:36:52

[JAVA] 基于TCP的起重机运行模拟器的相关文章

java socket 基于TCP/IP 协议

Java socket 基于TCP/IP 协议应用 多线程服务器原理: 1.          服务器端创建serversocket并绑定要监听的端口号 ,循环调用serversoket 的accept()方法,等待客户端的连接请求 2.          客户端创建一个socket绑定服务器端的IP地址和服务器监听的端口号并请求和服务器端连接 3.          服务器端接收到客户端的请求后,创建一个socket与客户端建立专线连接 4.          建立连接的两个socket在一个

Java Socket实现基于TCP和UDP多线程通信

一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSocket类. 1.2 服务器端套路 1.创建ServerSocket对象,绑定监听端口. 2.通过accept()方法监听客户端请求. 3.连接建立后,通过输入流读取客户端发送的请求信息. 4.通过输出流向客户端发送响应信息. 5.关闭响应的资源. 1.3 客户端套路 1.创建Socket对象,指明

JAVA Socket 底层是怎样基于TCP/IP 实现的???

首先必须明确:TCP/IP模型中有四层结构:       应用层(Application Layer).传输层(Transport  Layer).网络层(Internet Layer  ).链路层(LinkLayer)  其中Ip协议(Internet Protocol)是位于网络层的,TCP协议时位于传输层的.通过Ip协议可以使可以使两台计算机使用同一种语言,从而允许Internet上连接不同类型的计算机和不同操作系统的网络.Ip协议只保证计算机能够接收和发送分组数据. 当计算机要和远程的计

基于Java的TCP Socket通信详解(计算机端/Android手机端)

TCP Socket通信是一种比较常用的基于连接的网络通信方式.本文通过Java实现TCP Socket通信,并将其用于计算机端.Android手机端,同时做到代码规范化,实现代码最大化复用. 本文代码可在GitHub下载,建议对照源码阅读文章 https://github.com/jzj1993/JavaTcpSocket TCP连接的建立 客户端和服务器间通过三次握手建立TCP连接.在Java中,连接建立完成后,服务器端和客户端分别获取到一个Socket实例,之后就可以通过这个Socket实

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

java总用Socket 基于tcp通信模拟

/* * 基于TCP协议的socket通信,实现用户登录 */ public class ServerMain1 { public static void main(String[] args) { try { //1.创建一个服务器端的Socket,ServerSocket ,指定绑定的端口,并监听此端口 ServerSocket serverSocket=new ServerSocket(8888);//端口已设置1023以后的端口 //2.调用accept()方法开始监听,等待客户端连接

Java中的基于Tcp协议的网络编程

一:网络通信的三要素? IP地址     端口号     通信协议 IP地址:是网络中设备的通信地址.由于IP地址不易记忆,故可以使用主机名.本地环回地址,127.0.0.1   本地主机名localhost 端口号:发送端准备的数据要发送到指定的目的应用程序上,为了标识这些应用程序,所以用网络数字来标识这些不同的应用程序,这些数 字称为端口号.端口号是不同进程之间的标识.一般来说,有0~65535的端口可供使用,但是1~1024系统使用,或者称作保留端口. 通信协议:指定义的通信规则,这个规则

基于TCP的Socket通信

这里的例程跟前面"基于TCP的Socket"类似,前面是客户端给服务器端发信息,这里是服务器端给客户端发信息 TCP通信模式: TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信两端之间形成网络虚拟链路. 一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信. Java使用Socket对象来代表两端的通信接口,并通过Socket产生I/O流来进行网络通信. SimpleServer.java  服务器程序,不需要建立Android项目,

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信