如何解决Spring集成tcpClient未收到消息
我正在开发一个与 ServerSocket
通信的应用程序。
我正在使用 spring 集成的 TCP 客户端连接到服务器以发送和接收消息。
每个部分如下快照代码:
服务器:
public void startSocketServer(){
try (final ServerSocket serverSocket = new ServerSocket(9992)) {
gl.info("Server is listening on: " + serverSocket.getLocalSocketAddress());
while (true) {
final Socket socket = serverSocket.accept();
gl.info("A new client connected");
new SocketThread(socket).start();
}
} catch (IOException e) {
e.printstacktrace();
}
}
private class SocketThread extends Thread {
private final Socket socket;
private final PrintWriter writer;
private final BufferedReader reader;
public SocketThread(Socket socket) throws IOException {
this.socket = socket;
InputStream input = socket.getInputStream();
OutputStream output = socket.getoutputStream();
reader = new BufferedReader(new InputStreamReader(input));
writer = new PrintWriter(output,true);
}
public void run() {
try {
while (true) {
String inputMessage = reader.readLine();
if (inputMessage != null) {
MessageType messageType = getTypeInstance(inputMessage);
if (messageType instanceof LoginMessage loginMessage) {
if (isAuthenticated(loginMessage.getUsername(),loginMessage.getpassword())) {
gl.info("#### SERVER => User authorized");
final String messageBody = createConnectionAckMessage();
print(writer,messageBody);
} else {
print(writer,createRefusalMessage());
}
} else if (messageType instanceof StartTransferingData startData) {
getMessages().forEach(message-> print(writer,message));
} else if (messageType instanceof disconnectionAck disAck) {
print(writer,"By then")
break;
}
}
}
socket.close();
} catch (IOException ex) {
gl.info("Server exception: " + ex.getMessage());
}
}
private void print(PrintWriter writer,String msg) {
writer.print(msg);
writer.print("\r\n");
}
}
和客户:
public class CapConfig {
@MessagingGateway(defaultRequestChannel = "toTcp",errorChannel = "errorChannel")
public interface TcpGateway {
@Gateway
void send(String in);
}
@Bean
public MessageChannel toTcp() {
return new DirectChannel();
}
@Bean
public AbstractClientConnectionFactory clientCF() {
return Tcp.netClient("localhost",9992)
.serializer(TcpCodecs.crlf())
.deserializer(TcpCodecs.crlf())
.get();
}
@Bean
public IntegrationFlow tcpOutFlow(AbstractClientConnectionFactory connectionFactory) {
return IntegrationFlows.from(toTcp())
.handle(Tcp.outboundAdapter(connectionFactory))
.get();
}
@Bean
public IntegrationFlow tcpInFlow(AbstractClientConnectionFactory connectionFactory) {
return IntegrationFlows.from(Tcp.inboundAdapter(connectionFactory))
.transform(stringTransformer)
.log()
//---- Do some other stuffs
.get();
}
}
场景如下:
客户端向网关发送用户名和密码,然后服务器接收消息并对其进行身份验证,如果客户端通过身份验证,则服务器向客户端发送 connectionAck 消息以表明连接已被接受。 然后客户端向服务器发送startData消息开始数据传输。
问题是:
当客户端向服务器发送username&pass,服务器向客户端发送connectionAck时,客户端没有收到消息!!!!!!。
有什么帮助吗? 提前致谢。
解决方法
我只是使用了 writer.println(msg)
而不是 writer.print(msg)
,问题解决了。
我不知道为什么,但它奏效了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。