【问题标题】:Java server using spring-integration-ip使用 spring-integration-ip 的 Java 服务器
【发布时间】:2013-10-31 02:09:53
【问题描述】:

服务器使用java,通过TCP与C++客户端通信。当用户离开计算机超过5分钟时,客户端将向服务器发送一个字节数组。java服务器是由spring-integration-ip编写的。我很困惑是否应该设置using-nio="true"?有什么问题吗?关于并发?如何使用自定义协议转换字节数组?我是 TCP 和 spring-integration 的新手,感谢您的帮助!

我在按照示例编写应用程序时遇到问题。服务器反序列化字节流然后回显服务,但回显服务返回后客户端无法接收序列化字节流。

spring-tcp.xml:

<int-ip:tcp-connection-factory 
     id="serverConnectionFactory"
     type="server" port="5678" 
     using-nio="true" 
     serializer="connectionSerializeDeserialize"
     deserializer="connectionSerializeDeserialize" />

<bean id="connectionSerializeDeserialize" 
      class="com.snail.tcp.CustomSerializerDeserializer" />

<int-ip:tcp-inbound-gateway id="gatewayCrLf"
    connection-factory="serverConnectionFactory" request-channel="toSA"
    error-channel="errorChannel" />

<int:channel id="toSA" />

<int:service-activator input-channel="toSA"
    ref="echoService" method="test" />
<bean id="echoService" class="com.snail.tcp.EchoService" />

(反)序列化方法:

private static final int LENGTH = 2;
private static final int FLAG = 2;


@Override
public String deserialize(InputStream is) throws IOException {
    logger.debug("begin deserialize");
    int length = Integer.valueOf(parseString(is, LENGTH));
    int flag = Integer.valueOf(parseString(is, FLAG));
    String content = parseString(is, length);
    return content;
}

@Override
public void serialize(String s, OutputStream os) throws IOException {
    logger.debug("begin serialize:" + s);
    byte[] content = s.getBytes();
    os.write(content);
    os.flush();
}

回显服务:

 public String test(String input) {
    logger.debug("echo service:" + input);
    //some service...
    return "echo:" + input;
}

主要方法:

 public static void main(String[] args) {
    Socket socket = null;
    Writer out = null;
    BufferedReader in=null;
    try {
        socket = new Socket("127.0.0.1", 5678);
        socket.setSoTimeout(10000);
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        out.write("1001HELLOWORLD");
        out.flush();

        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        StringBuffer str = new StringBuffer();
        int c;
        while ((c = in.read()) != -1) {
            str.append((char) c);
        }
        System.out.println(str.toString());
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            out.close();
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

控制台日志:

[DEBUG] com.snail.tcp.CustomSerializerDeserializer-deserialize(): 开始反序列化

[DEBUG] com.snail.tcp.EchoService-test(): echo service:HELLOWORLD

[DEBUG] com.snail.tcp.CustomSerializerDeserializer-serialize(): 开始序列化:echo:HELLOWORLD

但客户端无法接收到反序列化的消息“HELLOWORLD”,而是出现 SocketTimeoutException: Read timed out... 我想知道我哪里做错了,谢谢

【问题讨论】:

  • 您在这里问了很多不同的问题,但没有提供太多细节。我建议您将其分解为单独的问题,并在每个问题中提供一些详细信息,说明您到目前为止已尝试过什么、您想做什么以及究竟出了什么问题。

标签: java spring-integration


【解决方案1】:

框架负责并发;如果您支持大量客户端,您通常只需要 NIO;对于少数客户,一般不需要NIO。

您可以使用自定义(反)序列化程序,也可以在入站端点的下游放置一个转换器。

我建议您阅读Documentation,查看samples,如果您仍有任何问题,请返回更具体的问题。

【讨论】:

  • 感谢您的建议。请您解决上述问题。
  • 可能意味着序列化程序没有以客户端期望的方式终止消息;你看到logger.debug("Message sent " + message); 日志了吗?它应该出现在您的序列化程序调试消息之后。您的入站消息具有结构,但您的出站消息仅发送原始数据。客户不期望某种结构吗?您可能需要运行 Wireshark 或类似工具才能准确查看发送的内容。
  • 我调试我的服务器。当它在 serialize() 方法中执行 os.write(content) 时,它会引发 java.nio.channels.ClosedChannelException。我只想返回一个简单的字符串,例如“ SUCCESS”到客户端而不是结构。我可以在 serialize() 方法或其他地方实现这一点吗?
  • 您可以发送任何您想要(或您的客户需要)的东西;这对我来说看起来很奇怪。如果您收到 ChannelClosedException,则该通道已关闭。应该是客户端吧。如果您打开调试日志记录,所有连接打开/关闭活动都将被记录。
  • 我已经解决了,我只是把out.flush()改成out.close(),客户端就可以收到消息了!我觉得好像是服务端不知道消息结束,因此导致超时。谢谢你的相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多