【发布时间】:2020-12-29 19:33:45
【问题描述】:
嗯,我有一个集成了 Spring 的 TCP 客户端。我正在尝试连接到远程 TCP 服务器并从服务器异步写入的套接字接收数据。
但是,碰巧的是,我的客户端正在接收第一条消息,并且没有进一步从服务器套接字接收更多消息。(实际上查看服务器日志可以确定客户端已失去连接,但为什么?)
还有一件事是我如何在收到消息的那一刻触发某些功能? - 可能是 TcpConnectionHandler-handleMessage() 或 TcpLisetner - onMessage()。
最后,我想要一个 Spring TCP 客户端,它连接到远程服务器并接收数据,因为它到达了套接字。以下是我的配置和代码:
我的配置:
<bean id="javaSerializer" class="com.my.client.CustomSerializerDeserializer" />
<bean id="javaDeserializer" class="com.my.client.CustomSerializerDeserializer" />
<context:property-placeholder />
<!-- Client side -->
<int:gateway id="gw" service-interface="com.zebra.client.SimpleGateway" default-request-channel="input" default-reply-channel="replies" />
<int-ip:tcp-connection-factory id="client"
type="client" host="localhost" port="5678" single-use="false"
so-timeout="100000" serializer="javaSerializer" deserializer="javaDeserializer"
so-keep-alive="true" />
<int:channel id="input" />
<int:channel id="replies">
<int:queue />
</int:channel>
<int-ip:tcp-outbound-channel-adapter
id="outboundClient" channel="input" connection-factory="client" />
<int-ip:tcp-inbound-channel-adapter
id="inboundClient" channel="replies" connection-factory="client"
client-mode="true" auto-startup="true" />
我的 Tcp 服务器:
while(true)
{
try
{
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to "
+ server.getRemoteSocketAddress());
DataOutputStream out =
new DataOutputStream(server.getOutputStream());
out.write("ACK\r\n".getBytes());
out.flush();
//server.close();
}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
服务器日志:
正在端口 5678 上等待客户端... 刚刚连接到/127.0.0.1:56108 正在端口 5678 上等待客户端...
我的 TcpClient:
final GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.load("classpath:config.xml");
context.registerShutdownHook();
context.refresh();
final SimpleGateway gateway = context.getBean(SimpleGateway.class);
int i=0;
while(i++<10){
String h = gateway.receive();
System.out.println("Received message "+h);
}try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我的客户日志:
收到消息确认
收到的消息 收到消息 收到消息 收到消息 收到消息 收到消息 收到消息 收到消息 收到消息
我的自定义反序列化器:
@Override
public String deserialize(InputStream inputStream) throws IOException {
// TODO Auto-generated method stub
StringBuilder builder = new StringBuilder();
int size = inputStream.available();
int c;
for (int i = 0; i < size; ++i) {
c = inputStream.read();
if(c!=-1){
builder.append((char)c);
}
else{
break;
}
}
return builder.toString();
}
我的网关:
public interface SimpleGateway {
public String receive();
}
如果您还有其他问题,请告诉我。
【问题讨论】: