// TcpClient.java
|
package home;
|
|
import java.io.*;
|
import java.net.Socket;
|
import java.net.SocketTimeoutException;
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
import java.util.Locale;
|
import java.util.ResourceBundle;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.InputStream;
|
import java.util.PropertyResourceBundle;
|
|
public class TcpClient extends NetworkBase {
|
|
/**
|
* 获取资源包
|
*/
|
private static ResourceBundle getResourceBundle() {
|
try {
|
Locale locale = Locale.SIMPLIFIED_CHINESE; // 默认中文
|
String fileName = locale.equals(Locale.ENGLISH) ?
|
"Messages_en.properties" : "Messages_zh.properties";
|
File langFile = new File("systemfile/" + fileName);
|
if (langFile.exists()) {
|
try (InputStream inputStream = new FileInputStream(langFile)) {
|
return new PropertyResourceBundle(inputStream);
|
}
|
}
|
} catch (Exception e) {
|
// 如果加载失败,使用默认
|
}
|
return null;
|
}
|
|
/**
|
* 获取国际化字符串
|
*/
|
private static String getString(String key) {
|
ResourceBundle bundle = getResourceBundle();
|
if (bundle != null) {
|
try {
|
return bundle.getString(key);
|
} catch (Exception e) {
|
// 如果找不到键,返回默认值
|
}
|
}
|
// 默认中文值
|
if ("connection.failed.check.server".equals(key)) {
|
return "连接失败,请检查服务器端";
|
}
|
if ("tcp.client.connected".equals(key)) {
|
return "TCP客户端已连接";
|
}
|
if ("tcp.client.disconnected".equals(key)) {
|
return "TCP客户端已断开";
|
}
|
return key;
|
}
|
private Socket socket;
|
private OutputStream outputStream;
|
private InputStream inputStream;
|
private ExecutorService receiverThread;
|
|
public TcpClient(String host, int port) {
|
this.host = host;
|
this.port = port;
|
}
|
|
@Override
|
public boolean start() throws Exception {
|
try {
|
socket = new Socket();
|
socket.connect(new java.net.InetSocketAddress(host, port), 5000); // 5秒连接超时
|
socket.setSoTimeout(1000);
|
|
outputStream = socket.getOutputStream();
|
inputStream = socket.getInputStream();
|
|
isRunning.set(true);
|
startReceiver();
|
notifyStatus(getString("tcp.client.connected") + " - " + host + ":" + port, true);
|
return true;
|
|
} catch (Exception e) {
|
notifyError(getString("connection.failed.check.server") + ": " + e.getMessage());
|
return false;
|
}
|
}
|
|
@Override
|
public void stop() {
|
isRunning.set(false);
|
try {
|
if (outputStream != null) outputStream.close();
|
if (inputStream != null) inputStream.close();
|
if (socket != null) socket.close();
|
} catch (Exception e) {
|
// 忽略关闭时的异常
|
}
|
if (receiverThread != null) {
|
receiverThread.shutdownNow();
|
}
|
notifyStatus(getString("tcp.client.disconnected"), false);
|
}
|
|
@Override
|
public boolean sendData(String data) throws Exception {
|
if (outputStream != null && !socket.isClosed()) {
|
try {
|
outputStream.write(data.getBytes());
|
outputStream.flush();
|
return true;
|
} catch (IOException e) {
|
return false;
|
}
|
}
|
return false;
|
}
|
|
/**
|
* 发送字节数据
|
*/
|
public boolean sendData(byte[] data) throws Exception {
|
if (outputStream != null && !socket.isClosed()) {
|
try {
|
outputStream.write(data);
|
outputStream.flush();
|
return true;
|
} catch (IOException e) {
|
return false;
|
}
|
}
|
return false;
|
}
|
|
@Override
|
public boolean isConnected() {
|
return isRunning.get() && socket != null && !socket.isClosed() && socket.isConnected();
|
}
|
|
private void startReceiver() {
|
receiverThread = Executors.newSingleThreadExecutor();
|
receiverThread.execute(() -> {
|
byte[] buffer = new byte[1024];
|
while (isRunning.get() && socket != null && !socket.isClosed()) {
|
try {
|
int bytesRead = inputStream.read(buffer);
|
if (bytesRead > 0) {
|
byte[] receivedData = new byte[bytesRead];
|
System.arraycopy(buffer, 0, receivedData, 0, bytesRead);
|
String fromAddress = socket.getInetAddress().getHostAddress() + ":" + socket.getPort();
|
|
// 调用字节数组版本的notifyData方法
|
notifyData(receivedData, fromAddress);
|
} else if (bytesRead == -1) {
|
// 服务器断开连接
|
break;
|
}
|
} catch (SocketTimeoutException e) {
|
// 超时正常,继续循环检查停止状态
|
} catch (Exception e) {
|
if (isRunning.get()) {
|
//notifyError("接收数据错误: " + e.getMessage());
|
stop();
|
}
|
}
|
}
|
});
|
}
|
|
/**
|
* 通知数据接收(字节数组版本)
|
*/
|
protected void notifyData(byte[] data, String fromAddress) {
|
if (dataListener != null) {
|
dataListener.onDataReceived(data, fromAddress);
|
}
|
}
|
}
|