Мы использовали следующий фрагмент кода для Tcp-сервера:
try (ServerSocket serverSocket = new ServerSocket(port)) {
while (true) {
Socket socket = serverSocket.accept();
new ServerThread(socket).start();
}
}
и ServerThread
:
private class ServerThread extends Thread {
private final Socket socket;
private ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (final InputStreamReader reader = new InputStreamReader(socket.getInputStream());
final OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream())) {
int bytesRead;
char[] buffer = new char[1024];
while ((bytesRead = reader.read(buffer)) != -1){
System.out.println(new String(buffer, 0, bytesRead));
writer.write(/* some char[] */);
writer.flush();
}
// ...
socket.close();
} catch (IOException exception){
// ...
socket.close();
}
}
}
Мы недавно перешли на использование интеграции с Spring:
@Bean
public TcpNetServerConnectionFactory connectionFactory() {
TcpNetServerConnectionFactory factory = new TcpNetServerConnectionFactory(9000);
ByteArrayRawSerializer serializer = new ByteArrayRawSerializer();
factory.setDeserializer(serializer);
factory.setSerializer(serializer);
return factory;
}
@Bean
public TcpReceivingChannelAdapter channelAdapter(AbstractServerConnectionFactory connectionFactory) {
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setConnectionFactory(connectionFactory);
adapter.setOutputChannel(messageChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "outputChannel")
public TcpSendingMessageHandler messageHandler(AbstractServerConnectionFactory connectionFactory){
final TcpSendingMessageHandler handler = new TcpSendingMessageHandler();
handler.setConnectionFactory(connectionFactory());
return handler;
}
@Bean
public MessageChannel messageChannel() {
return new DirectChannel();
}
@Bean
@Transformer(inputChannel = "messageChannel", outputChannel = "loggingChannel")
public ObjectToStringTransformer loggingTransformer() {
return new ObjectToStringTransformer();
}
@Bean
@ServiceActivator(inputChannel = "loggingChannel")
public void log(String message) {
System.out.println(message);
}
с вышеуказанной конфигурацией; мы успешно получаем сообщения и распечатываем их. Когда я получаю доступ к приложению Spring с клиентом Te lnet, я получаю сообщения на терминале, однако клиентское приложение (написанное на C ++ с WinSock2.h
) получает тайм-аут. Чем отличается приложение и как имитировать поведение OutputStreamWriter
s
writer.write(/* some char[] */);
writer.flush();
с TcpSendingMessageHandler
для приложения WinSock2.h
?