当前位置: 首页 > 知识库问答 >
问题:

使用spring集成ip的Java服务器

商鸿哲
2023-03-14

服务器使用java,并通过TCP与C客户端通信。当用户离开计算机超过5分钟时,客户端将向服务器发送一个字节数组。java服务器由spring集成ip编写。我不知道是否应该使用nio=“true”设置?并发有什么问题吗?如何使用自定义协议转换字节数组?我是TCP和spring集成的新手,谢谢你的帮助!

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

Springtcp。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-反序列化():开始反序列化

[调试]com.snail.tcp.EchoService-test():回显服务:HELLOWORLD

[调试]com.snail.tcp.CustomSerializerDeserializer-序列化():开始序列化:回显:HELLOWORLD

但是客户端无法接收反序列化消息“HELLOWORLD”,而是SocketTimeoutException:Read超时。。。我想知道我哪里做错了,谢谢

共有1个答案

昌和悦
2023-03-14

框架负责并发性;通常只有在支持大量客户时才需要NIO;对于少数客户机,通常不需要NIO。

您可以使用自定义(反)序列化器,也可以将转换器放在入站endpoint的下游。

我建议您阅读文档,查看示例,如果您还有任何问题,请带着更具体的问题回来。

 类似资料:
  • 我正在尝试如何在使用Eureka的Spring Boot应用程序上构建集成测试。说我有考试 我的代码路径中有该 api 调用: 这将NPE。发现客户端返回为空。如果我直接启动 Spring 启动应用程序并自己使用 API,代码工作正常。我在任何地方都没有特定的个人资料用法。我需要为发现客户端配置一些特殊的 wrt Eureka 以进行测试吗?

  • 我试图从Spring集成示例中转换“Hello World示例”(https://github.com/spring-projects/spring-integration-samples/tree/master/basic/helloworld)从XML到Java配置(使用注释也是如此)。 配置类如下所示: 为了测试它,我使用示例项目提供的: 我在控制台中看到“Message payload:t

  • 我在一个简单的POJO中配置了一个服务激活器,我想将其转换为Java DSL。 现在,我的Java DSL如下所示, 有一个带有服务激活器的POJO, 在XML中,相应的配置如下所示, 如何在Java DSL中调用ServiceActivator方法?我正在考虑使用,但参数应该是什么 在使用Java DSL时,是否有空通道的概念?如果是,我们如何指定

  • 我需要从REST服务调用SOAP Webservice。我在我的项目中使用Spring集成。目前,我正在使用基于xml的配置来实现目标。但我想用java dsl编写代码。请帮助我如何使用Spring集成DSL从REST服务调用SOAP服务。 一个例子会很有帮助。

  • 如何将具有approle[in vault]的微服务连接到具有vault后端的Spring Cloud Config Server。 我可以看到使用根令牌的示例,如curl-x GET http://localhost:8888/my-service/default-h“x-config-token:s.tmqara2lasdnhjzqqzy7y8px”。但是我找不到任何使用approle连接sp

  • 我一直在使用spring integration,我想连接多个ftp服务器来从远程位置检索文件,谁能给我一个好的例子,如何使用spring integration连接多个ftp服务器 先谢谢你,Udeshika