这里有一个不断从三个串口采集数据并进行计算的程序,为了便于调试,就在我的电脑上模拟了三个串口,每个串口与一个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:如果要用的话,就用后者吧,第一个纯粹是为了使用内部类而使用内部类的。
分享到:
相关推荐
本项目“socket定时发送数据小程序”正是这样一个专注于通过定时器发送数据的应用。在这个程序中,我们利用了Socket接口来建立客户端与服务器端的连接,并通过定时器(Timer)实现周期性地发送数据。 首先,我们要...
可以尝试向一个已知网站发送请求,根据响应判断代理是否正常工作。可以使用`requests`库的`Session`对象,以便在多次请求之间保持相同的会话状态,包括代理设置。 4. **自动切换**:为了实现自动切换,可以设定一个...
Clk:时钟输入 Reset:复位输入引脚 rom_data_i:ROM 数据输入 ram_data_i :RAM 数据输入 int0_i 外部中断 0 int1_i:外部中断 1 all_t0_i:定时计数 0 all_t1_i:定时计数 1 all_rxd_i:串口接收 p0_i:IO-port0 ...
- DataCollector:getNativeIP用于获取本地IP地址,其他如initlog初始化日志,mappingLogBuffer映射日志缓冲区,parseLogBuffer解析日志缓冲区,match匹配记录,send发送数据等方法,共同完成数据处理流程。...
- storefile:数据发送失败时的临时存储文件。 三、数据整合与分析: 数据采集完成后,需要进行整合与分析。这部分可能包括清洗、转换、整合多个来源的数据,以便进行后续的业务洞察、性能监控或故障排查。具体...
这里的`'255.255.255.255'`是广播地址,表示向局域网内所有设备发送数据。`12345`是目标端口号,`54321`是本地端口号。`'Broadcast'`, `true`组合表示启用广播功能。 接着,我们可以编写函数来获取当前系统日期和...
基于多线程的QUdpSocket收发数据程序,界面上可以输入目标ip、port,与网络调试助手调试ok 欢迎下载,并指出程序中的问题,谢谢
- **数据发送**:虽然`IdUDPServer`主要用于接收数据,但它也提供了`SendTo`方法,可以向特定IP和端口发送UDP数据包。 3. **IdUDPClient组件**: - **初始化**:同样地,将`IdUDPClient`组件拖放到表单上,设置`...
4. **添加种子任务**:使用API添加种子任务通常涉及向URL `http://your_qbittorrent_ip:port/gui/command` 发送POST请求,参数包括`cmd=add-url`和`url=种子链接或本地种子文件路径`。 5. **监控下载状态**:你可以...
9. **发送端口**:指定向特定IP地址发送数据的端口号。 10. **定时查询socket端口时间**:由于采用定时轮询方式检查socket,因此需要设定检查间隔,以平衡响应速度和资源消耗。 11. **并口卡的存取缓冲数量**:...
- 连接成功后,GPRS模块首先发送数据至PC机,以使后者获取前者的IP地址和端口号。 - 随后的通信过程中,双方可自由发送数据。 - 在某些情况下,如上位机软件关闭了监听或GPRS模块从数据模式切换至命令模式,重新...
5. **发送备份文件**:在上述定时任务中,`/system smtp send`命令用于发送备份文件。`file-name`参数应与创建备份时指定的名称一致。 6. **安全注意事项**:确保SMTP服务器允许ROS的IP地址进行连接,并已启用必要...
只需将`jwatch.war`文件放到服务器的webapps目录下,重启服务器后,JWatch就会自动解压并启动,通常访问URL为`http://your_server_ip:port/jwatch`。 总的来说,JWatch是Quartz框架的得力助手,它增强了定时任务的...
- Start:开启定时发送APRS数据。 - Stop:停止发送APRS数据。 **设置界面** 1. **USER CREDENTIALS**: - Callsign:输入呼号,如BH5HGY,-5表示设备类型。 - Passcode:输入呼号的验证码,一般不变。 - ...
- `OnExecute`:当客户端连接并发送数据时触发,可以在此处理客户端的数据请求。 3. **Indy10 的优势**: - 网络协议广泛:除了TCP/IP,Indy10还支持UDP、HTTP、FTP、SMTP等众多网络协议。 - 可扩展性:通过组件...
然后定义一些辅助函数,如`remove_ip`用于从数据库中删除IP,`get_ip_num`获取IP数量,`get_port`获取IP对应的端口号,`add_ip`添加IP和端口,`get_all_ip`列出所有IP,以及`get_random_ip`随机获取一个IP: ...
`SendData`方法用于发送数据,这里我们发送一个空字节,因为实际的PING命令并不需要发送任何有效负载。然后,我们在`s_DataArrival`事件处理程序中接收并显示来自目标主机的响应。 需要注意的是,VB中的Socket组件...
16. **网络地址与端口号**:接入网络的计算机需要网络地址(如IP地址),而每个应用程序通常需要一个端口号(SAP或Port)以区分不同的服务。 17. **OSI模型的层次**:运输层是面向通信和面向端系统的层次,负责...
创建一个QTimer对象,设置其超时信号与槽函数关联,当定时器触发时,槽函数会被调用来发送数据: ```cpp QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MyClass::sendData); timer->...