定时向IP:Port发送数据

  这里有一个不断从三个串口采集数据并进行计算的程序,为了便于调试,就在我的电脑上模拟了三个串口,每个串口与一个IP:Port对应,这样编写程序定时向IP:Port发送数据,就可以在对应的模拟串口中接收到数据了。
如下是两个程序,一个写成内部类的形式,一个写成一个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:如果要用的话,就用后者吧,第一个纯粹是为了使用内部类而使用内部类的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值