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

当我使用spring集成作为tcp客户端时,如何向服务器发送EOF信号?

翁和颂
2023-03-14

我想用spring集成来代替socket客户端。我的socket客户端代码如下:

public static void main(String[] args) {

    try {
        Socket socket = new Socket("localhost", 7779);
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        String str = "hello server!";
        pw.write(str);
        pw.flush();
        socket.shutdownOutput();
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String info = br.readLine();
        while (info != null) {
            System.out.println("i am client. server says that " + info);
            info = br.readLine();
            pw.close();
        }
        br.close();
        is.close();
        pw.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

套接字客户端将获取服务器的回复消息。我使用spring集成来完成同样的工作。spring integration的xml代码如下所示:

    <int:gateway id="gw"
             service-interface="org.springframework.integration.samples.tcpclientserver.SimpleGateway"
             default-request-channel="input"/>

<int-ip:tcp-connection-factory id="client"
                               type="client"
                               host="localhost"
                               port="7779"
                               single-use="true"
                               so-timeout="10000"/>

<int:channel id="input"/>

<int-ip:tcp-outbound-gateway id="outGateway"
                             request-channel="input"
                             reply-channel="clientBytes2StringChannel"
                             connection-factory="client"
                             request-timeout="10000"
                             reply-timeout="10000"/>

<int:object-to-string-transformer id="clientBytes2String"
                                  input-channel="clientBytes2StringChannel"/>

这是spring integration的tcp客户端服务器示例的一部分https://github.com/spring-projects/spring-integration-samples/tree/master/basic/tcp-client-server

java代码如下:

    final Scanner scanner = new Scanner(System.in);
    final GenericXmlApplicationContext context = Main.setupContext();
    final SimpleGateway gateway = context.getBean(SimpleGateway.class);
    final AbstractServerConnectionFactory crLfServer = context.getBean(AbstractServerConnectionFactory.class);

    TestingUtilities.waitListening(crLfServer, 10000L);

    while (true) {

        final String input = scanner.nextLine();

        if ("q".equals(input.trim())) {
            break;
        }
        else {
            final String result = gateway.send(input);
            System.out.println(result);
        }
    }

    System.out.println("Exiting application...bye.");
    System.exit(0);

}

public static GenericXmlApplicationContext setupContext() {
    final GenericXmlApplicationContext context = new GenericXmlApplicationContext();

    if (System.getProperty(AVAILABLE_SERVER_SOCKET) == null) {
        System.out.print("Detect open server socket...");
        int availableServerSocket = SocketUtils.findAvailableTcpPort(5678);

        final Map<String, Object> sockets = new HashMap<>();
        sockets.put(AVAILABLE_SERVER_SOCKET, availableServerSocket);

        final MapPropertySource propertySource = new MapPropertySource("sockets", sockets);

        context.getEnvironment().getPropertySources().addLast(propertySource);
    }

    System.out.println("using port " + context.getEnvironment().getProperty(AVAILABLE_SERVER_SOCKET));

    context.load("classpath:META-INF/spring/integration/tcpClientServerDemo-context.xml");
    context.registerShutdownHook();
    context.refresh();

    return context;
}

我无法得到服务器的回复,因为服务器没有收到eof信号,并且它仍然在readLine()中被阻塞;我得到的例外:org。springframework。集成。MessageTimeoutException:等待响应超时。

这是服务器代码:

try {
        ServerSocket serverSocket = new ServerSocket(7779);
        Socket socket = serverSocket.accept();
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String info = br.readLine();
        System.out.println("from client : "+info);
        while (info != null) {
            System.out.println("i am server. message from client is " + info);
            info = br.readLine(); //server blocked here
        }
        socket.shutdownInput();
        OutputStream os = socket.getOutputStream();
        String replyMsg="welcom from server 7779 ACK\r\n";
        os.write(replyMsg.getBytes());
        os.close();
        br.close();
        isr.close();
        is.close();
        socket.close();
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

那么,如何向服务器发送eof信号,以便我的应用程序获得服务器的回复呢?

共有1个答案

程景胜
2023-03-14

Spring集成目前不支持那些ShutDown*()方法。

请打开GitHub问题,我们将进行查看。

 类似资料:
  • 我需要实现一个TCP服务器,它基本上应该在与客户端握手时打开一个套接字。 套接字打开后服务器需要保持套接字打开,并且能够通过打开的套接字将消息从服务器推送到客户端 我查看了一些spring集成示例,但不确定我所看到的示例是否确实参考了我的需求。 1. Spring集成tcp是否有这种能力来保持打开套接字并将消息从服务器发送到客户端? 服务器还应支持传入请求 客户端实现是作为简单Tcp java客户

  • 我试图将一个对象从服务器端发送到客户端,但找不到问题。以下是我在客户端遇到的错误: 下面是服务器端方法:无限循环中的separate方法只是从文件中读取,并将用户名和密码解析为ArrayList,这是服务器类中的实例变量。 以下是从服务器请求信息的客户端: 我对学习服务器套接字和套接字还不熟悉,但我在这里试图实现的是以下目标。当我在另一节课上按下按钮时,我会这样做: 几乎是一个通过服务器到clei

  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示

  • 问题内容: 我将实现类似于Facebook通知和此网站的内容(StackOverflow的通知会通知我们是否有人为我们的问题写评论/答案等)。请注意,用户将使用我的应用程序作为网站而不是移动应用程序。 我遇到以下获取结果的答案,但我需要推送结果而不是获取结果。 根据建议,我在实体类中创建了一个简单方法,并向其中添加了@PostPersist,但此方法不起作用,因此基于此答案,我添加了persist

  • 我正在使用JavaNetty开发一个高负载tcp应用程序,该应用程序希望300k并发TCP连接。 它在测试服务器上工作得很好,可以到达300k个连接,但当部署到生产服务器时,它只能支持65387个连接,到达这个数量后,客户端将抛出“java.io.IOException:Connection reset by peer”异常。我尝试了很多次,每次当连接数达到65387时,客户端将无法创建连接。 网