我有一个应用程序,它必须通过tcp套接字将数据发送到另一个应用程序。这是从客户端到服务器的单向流。发送数据时,客户端必须重试/重新连接,并尝试确保在接收器/侦听器/服务器死亡/消失或断开连接时发送所有数据。我的代码如下:
public class TCPSocket implements Closeable {
private static final int SIXTY_FOUR_KB = 65536;
private final String ip;
private final int port;
private Socket socket;
private BufferedOutputStream writer;
public TCPSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
public TCPSocket connect() throws ConnectException {
try {
socket = new Socket(ip, port);
socket.setSendBufferSize(SIXTY_FOUR_KB);
writer = new BufferedOutputStream(socket.getOutputStream(), SIXTY_FOUR_KB);
} catch (Exception e) {
throw new ConnectException(e.getMessage());
}
return this;
}
public void write(String message) throws InterruptedException {
boolean succeeded = true;
do {
try {
writer.write(message.getBytes(StandardCharsets.UTF_8));
writer.write("\n".getBytes(StandardCharsets.UTF_8));
} catch (Exception e) {
System.out.println(e.getMessage());
succeeded = false;
// Exponential backoff to go here
try {
System.out.println("Attempting reconnection");
tryClose();
connect();
} catch (ConnectException connectException) {
System.out.println(connectException.getMessage());
}
}
} while (!succeeded);
}
private void tryClose() {
try {
close();
} catch (Exception ex) {
System.out.println("Failed closing TCPSocket");
}
}
@Override
public void close() throws IOException {
if (writer != null) {
writer.flush();
writer.close();
writer = null;
}
if (socket != null && !socket.isClosed()) {
socket.close();
socket = null;
}
}
}
n、 b:使用bufferedoutputstream的原因是因为我发送的是小消息,而所有其他方法在实际测试场景中都无法获得相同的吞吐量。
这一切对我来说都是正常的,但是我有几点。
这是正确的方式做这件事或完全疯狂,将导致严重的问题?
在打开新连接之前尝试清理并关闭连接和写入程序时,会抛出以下错误,并且我无法关闭bufferedoutputstream
java.net.socketexception:连接被对等方重置:套接字写入错误
如果我 socket.shutdownOutput();
在尝试关闭输出流之前,这也会引发异常。清理和重新连接的正确方法是什么?
暂无答案!
目前还没有任何答案,快来回答吧!