Java Socket 定时读取数据


//客户端:
package com.socket.example;

import java.io.*;
import java.net.*;
import java.util.TimerTask;

/**
*
* @author li_yf
* RemoteFileClient
*
*/
public class RemoteFileClient extends TimerTask {
protected String hostIp;
protected int hostPort;
protected BufferedReader socketReader;
protected PrintWriter socketWriter;

public RemoteFileClient(String aHostIp, int aHostPort) {
hostIp = aHostIp;
hostPort = aHostPort;
}

public void setUpConnection() {
try {
Socket client = new Socket(hostIp, hostPort);
socketReader = new BufferedReader(new InputStreamReader(client
.getInputStream()));
socketWriter = new PrintWriter(client.getOutputStream(),true);
} catch (UnknownHostException e) {
System.out
.println("Error setting up socket connection: unknown host at "
+ hostIp + ":" + hostPort);
} catch (IOException e) {
System.out.println("Error setting up socket connection: " + e);
}
}

public String getFile(String fileNameToGet) {
StringBuffer fileLines = new StringBuffer();
try {
socketWriter.println(fileNameToGet);
socketWriter.flush();
String line = null;
while ((line = socketReader.readLine()) != null)
fileLines.append(line + "\n");
} catch (IOException e) {
System.out.println("Error reading from file: " + fileNameToGet);
}
return fileLines.toString();
}

public void tearDownConnection() {
try {
socketWriter.close();
socketReader.close();
} catch (IOException e) {
System.out.println("Error tearing down socket connection: " + e);
}
}

@Override
public void run() {
// TODO Auto-generated method stub
RemoteFileClient remoteFileClient = new RemoteFileClient("192.168.0.6",
139);
remoteFileClient.setUpConnection();
String fileContents = remoteFileClient.getFile("E:\\RemoteFile.txt");
remoteFileClient.tearDownConnection();
//String name=new String ((fileContents.getBytes("iso-8859-1"),);
System.out.println("读取的远程内容:"+fileContents);

}
}


//服务器端:

package com.socket.example;

import java.io.*;
import java.net.*;

/**
*
* @author li_yf
* RemoteFileServer
*
*/
public class RemoteFileServer {
protected int listenPort = 139;

public static void main(String[] args) {
RemoteFileServer server = new RemoteFileServer();
server.acceptConnections();
}

public void acceptConnections() {
try {
ServerSocket server = new ServerSocket(listenPort);
Socket incomingConnection = null;
while (true) {
incomingConnection = server.accept();
handleConnection(incomingConnection);
}
} catch (BindException e) {
System.out.println("Unable to bind to port " + listenPort);
} catch (IOException e) {
System.out.println("Unable to instantiate a ServerSocket on port: "
+ listenPort);
}
}

public void handleConnection(Socket incomingConnection) {
try {
OutputStream outputToSocket = incomingConnection.getOutputStream();
InputStream inputFromSocket = incomingConnection.getInputStream();
BufferedReader streamReader = new BufferedReader(
new InputStreamReader(inputFromSocket));
FileReader fileReader = new FileReader(new File(streamReader
.readLine()));
BufferedReader bufferedFileReader = new BufferedReader(fileReader);
PrintWriter streamWriter = new PrintWriter(incomingConnection
.getOutputStream());
String line = null;
while ((line = bufferedFileReader.readLine()) != null) {
streamWriter.println(line);
}
fileReader.close();
streamWriter.close();
streamReader.close();
} catch (Exception e) {
System.out.println("Error handling a client: " + e);
}
}
}


//main方法:
package com.socket.example;

import java.util.Timer;

public class TimerTaskClass {
private static int TIME_INTERVAL = 10 * 1000;
private static String SOCKET_SERVER = "192.168.0.6";
private static int SOCKET_PORT = 139;

public static void main(String args[]) {
Timer timer = new Timer();
timer.schedule(new RemoteFileClient(SOCKET_SERVER, SOCKET_PORT),
1 * 1000, TIME_INTERVAL);
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Socket自动重连,可以在Socket连接失败后,使用一个循环不断尝试重新连接,直到连接成功为止。连接失败可以通过捕获SocketException异常来判断。 判断远端服务器的连接状态可以通过发送心跳包来实现。比如可以定时发送一个固定格式的数据包(心跳包)到服务器,如果一段时间内没有收到服务器的回应,则认为连接断开,需要进行重连。在Java中,可以使用ScheduledExecutorService来定时发送心跳包。 下面是一个简单的示例代码: ```java public class SocketClient { private static final int HEARTBEAT_INTERVAL = 5000; // 心跳间隔时间,单位毫秒 private String host = "localhost"; private int port = 8080; private Socket socket; private ScheduledExecutorService executorService; public void connect() { try { socket = new Socket(host, port); executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(() -> { try { // 发送心跳包 OutputStream outputStream = socket.getOutputStream(); outputStream.write("ping".getBytes()); outputStream.flush(); // 设置读取超时时间 socket.setSoTimeout(HEARTBEAT_INTERVAL); // 接收服务器的响应 InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); if (len > 0) { String response = new String(buffer, 0, len); if (!"pong".equals(response)) { // 服务器返回的响应不是预期的值,说明连接已断开,需要重连 throw new SocketException("Unexpected response from server"); } } else { // 服务器没有响应,说明连接已断开,需要重连 throw new SocketException("No response from server"); } } catch (IOException e) { try { socket.close(); } catch (IOException ex) { ex.printStackTrace(); } socket = null; System.out.println("Connection lost, trying to reconnect..."); } }, 0, HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS); } catch (IOException e) { System.out.println("Connection failed"); } } public void disconnect() { try { executorService.shutdown(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { SocketClient client = new SocketClient(); client.connect(); } } ``` 在上面的代码中,我们使用了一个ScheduledExecutorService来定时发送心跳包,并在心跳包发送失败后捕获SocketException异常来判断连接是否已断开。如果连接已断开,则关闭Socket并设置为null,并输出提示信息。在心跳包发送成功后,我们设置了读取超时时间,如果一段时间内没有收到服务器的回应,则也认为连接已断开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值