我需要实现一个TCP服务器,basicliy应该打开一个套接字作为与客户端握手的一部分。
套接字打开后服务器需要保持套接字打开,并能够通过打开的套接字从服务器向客户端发送消息
我看一些Spring集成示例,但不确定我看到的示例实际上是对我的requiremnt的引用。
1。弹簧集成tcp是否具有保持打开套接字并从服务器向客户端发送消息的能力?
服务器应支持传入请求
客户端实现是一个用简单的Tcp java客户端编写的模拟
谢谢! 尼尔
这里是上下文配置
<int-ip:tcp-connection-factory id="server"
type="server"
port="5679"
host="localhost"
single-use="false"
deserializer="javaDeserializer"
serializer="javaSerializer" />
<int-ip:tcp-inbound-channel-adapter id="inboundServer"
channel="inloop"
connection-factory="server" client-mode="false"/>
<int-ip:tcp-outbound-channel-adapter id="outboundServer"
channel="outloop"
connection-factory="server" client-mode="false"/>
<channel id="inloop"/>
<channel id="outloop"/>
在服务器端我使用
outputchanel.send(new GenericMessage<String>("HI World from server16\n",header));
并在客户端使用
读取推送消息 BufferedReader stdIn = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
while ((serverResponse = stdIn.readLine()) != null) {
_logger.info("RESPONSE FROM SERVER::"+serverResponse);
}
客户端是一个java base tcp客户端,没有配置spring集成,这是一个用于未来集成的模拟客户端
对于支持echo服务器的字节数组不以'\ n'终止的请求,我扩展AbstractByteArraySerializer,并覆盖反序列化
public byte[] deserialize(InputStream inputStream) throws IOException {
_Logger.trace("start deserialize");
byte[] result;
try {
byte[] buffer = new byte[getMaxMessageSize()];
int numOfBytes = inputStream.read(buffer, 0, buffer.length);
result = copyToSizedArray(buffer, numOfBytes);
} catch (IOException e) {
_Logger.error("Exception on deserialize tcp inbound stream ", e);
//publishEvent(e, , n);
throw e;
}
return result;
}
答案 0 :(得分:1)
您可以使用collaborating channel adapters在对等体之间进行完全任意的消息传递。
请参阅TCP Events。
tcp入站通道适配器(实际上是连接工厂)将在客户端连接时发布TcpConnectionOpenEvent
。
您可以使用ApplicationListener
接收这些活动。
该事件包含connectionId
。然后,您可以开始使用名为connectionId
(ip_connectionId
)的标头中的IpHeaders.CONNECTION_ID
向tcp出站通道适配器发送消息。
入站适配器收到的来自客户端的入站邮件(如果有)在标头中具有相同的值。
只需配置服务器连接工厂并配置两个适配器即可使用它。
如果服务器必须打开套接字,请使用client-mode="true"
并注入客户端连接工厂。