这里有一个不断从三个串口采集数据并进行计算的程序,为了便于调试,就在我的电脑上模拟了三个串口,每个串口与一个IP:Port对应,这样编写程序定时向IP:Port发送数据,就可以在对应的模拟串口中接收到数据了。
如下是两个程序,一个写成内部类的形式,一个写成一个java文件中有两个类的形式,另外还有一些知识点,也在代码中有所体现。
版本1:写成内部类的形式
编译后的class文件为:SendDataBySocket.class,SendDataBySocket$MyTimerTask.class
版本2:写成一个java文件中两个类的形式
编译后的class文件为:SendDataBySocket1.class,MyTimerTask.class
PS:如果要用的话,就用后者吧,第一个纯粹是为了使用内部类而使用内部类的。
如下是两个程序,一个写成内部类的形式,一个写成一个java文件中有两个类的形式,另外还有一些知识点,也在代码中有所体现。
版本1:写成内部类的形式
import java.net.*;
import java.io.*;
import java.util.*;
public class SendDataBySocket {
//out写在这里是为了在内部类中引用,内部类可以访问外围类的所有资源
public OutputStream out;
public static void main(String args[]) {
SendDataBySocket sdbs = new SendDataBySocket();
try {
//创建socket,以及输出流,注:该程序只发不收,所以没有写输入流,是client
Socket socket = new Socket("192.168.0.37", 6020);
sdbs.out = socket.getOutputStream();
Timer timer = new Timer();
//注意这里不能这样创建内部类的实例:MyTimerTask task = new MyTimerTask();
//应当如下创建,参见Thinking in java
SendDataBySocket.MyTimerTask task = sdbs.new MyTimerTask();
//在1s后,每隔1s启动定时器任务task
timer.schedule(task, 1000, 1000);
//响应用户输入,以退出程序
while (true) {
//BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//if(reader.readLine().equals("exit")){
// timer.cancel();
// break;
//}
//Stream流是字节流,8位,所以read()返回该字节的int值
//而reader是字符流,16位,并且提供了readLine()方法,直接返回一整行(String),
//如果需要,也可以使用上面注释掉的代码。
int ch = System.in.read();
if (ch - 'q' == 0) {
timer.cancel();
socket.close();
sdbs.out.close();
break;
}
}
System.exit(0);
} catch (Exception error) {
error.printStackTrace();
}
}
class MyTimerTask extends TimerTask {
public void run() {
try{
out.write("Hello server".getBytes());
}catch(Exception error) {
error.printStackTrace();
}
}
}
}
编译后的class文件为:SendDataBySocket.class,SendDataBySocket$MyTimerTask.class
版本2:写成一个java文件中两个类的形式
import java.net.*;
import java.io.*;
import java.util.*;
public class SendDataBySocket1 {
//public OutputStream out;
public static void main(String args[]) {
//SendDataBySocket1 sdbs = new SendDataBySocket1();
try {
Socket socket = new Socket("192.168.0.37", 6020);
OutputStream out = socket.getOutputStream();
Timer timer = new Timer();
//这里直接使用如下方式创建MyTimerTask的实例,并将输出流out传递给类MyTimerTask
MyTimerTask task = new MyTimerTask(out);
//SendDataBySocket.MyTimerTask task = sdbs.new MyTimerTask();
timer.schedule(task, 1000, 1000);
while (true) {
//BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//if(reader.readLine().equals("exit")){
// timer.cancel();
// break;
//}
int ch = System.in.read();
if (ch - 'q' == 0) {
timer.cancel();
socket.close();
out.close();
break;
}
}
System.exit(0);
} catch (Exception error) {
error.printStackTrace();
}
}
}
class MyTimerTask extends TimerTask {
private OutputStream output;
public MyTimerTask(OutputStream out){
output = out;
}
public void run() {
try{
output.write("Hello server".getBytes());
}catch(Exception error) {
error.printStackTrace();
}
}
}
编译后的class文件为:SendDataBySocket1.class,MyTimerTask.class
PS:如果要用的话,就用后者吧,第一个纯粹是为了使用内部类而使用内部类的。