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

如何设置Spring TCP客户端和服务器模型?

田马鲁
2023-03-14

因此,在这个问题之后(如何将TCP-IP客户端服务器插入Spring MVC应用程序),我成功地将网关连接到我的Spring REST控制器。但是,我不知道下一步该去哪里。这是我试图完成的:

1)当某个路由被POST请求击中时,打开从POST传递的某个IP的连接(或使用已使用此IP打开的连接)并发送消息。

@RequestMethod(value = '/sendTcpMessage', method=RequestMethod.POST)
public void sendTcpMessage(@RequestParam(value="ipAddress", required=true) String ipAddress,
                           @RequestParam(value="message", required=true) String message) {

//send the message contained in the 'message' variable to the IP address located 
//at 'ipAddress' - how do I do this?

}

2)我还需要我的Spring后端来监听传递给它的TCP“消息”,并将它们存储在缓冲区中。我的Javascript将每5秒左右调用一次路由,并从缓冲区中读取信息。

这是我的控制器代码:

@Controller
public class HomeController {

    @Resource(name = "userDaoImpl")
    private UserDAO userDao;
    @Resource(name = "receiveTcp")
    private ReceiveTcp tcpMessageReceiver;
    @Autowired
    SimpleGateway gw;

    String tcpBuffer[] = new String[100];

    @RequestMapping(value="/")
    public String home() {
        return "homepage";
    }

    @RequestMapping(value = "/checkTcpBuffer", method=RequestMethod.POST)
    public String[] passTcpBuffer() {
        return tcpMessageReceiver.transferBuffer();
    }

}

根上下文。xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:int-ip="http://www.springframework.org/schema/integration/ip"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/integration/ip http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd
                        http://www.springframework.org/schema/integration/ http://www.springframework.org/schema/integration/spring-integration.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->
<int:gateway id="gw"
   service-interface="net.codejava.spring.interfaces.SimpleGateway"
   default-request-channel="input"/>

<bean id="javaSerializer"
      class="org.springframework.core.serializer.DefaultSerializer"/>
<bean id="javaDeserializer"
      class="org.springframework.core.serializer.DefaultDeserializer"/>

<int-ip:tcp-connection-factory id="server"
    type="server"
    port="8081"
    deserializer="javaDeserializer"
    serializer="javaSerializer"
    using-nio="true"
    single-use="true"/>

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

    <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"/>

    <int-ip:tcp-inbound-channel-adapter id="inboundServer"
    channel="loop"
    connection-factory="server"/>

    <int-ip:tcp-outbound-channel-adapter id="outboundServer"
    channel="loop"
    connection-factory="server"/>

    <int:service-activator input-channel="input" ref="receiveTcp" method = "saveValue"/>

</beans>

接收TCP。爪哇

@Component(value = "receiveTcp")
public class ReceiveTcp {

    String buf[] = new String[100];
    int currentPosition = 0;

    @ServiceActivator
    public void saveValue(String value){
        System.out.println(value);
        buf[currentPosition] = value;
        currentPosition++;
    }

    public String[] transferBuffer() {
        String tempBuf[] = new String[100];
        tempBuf = buf;
        buf = new String[100];

        return tempBuf;
    }
}

我如何解决这些问题?

共有2个答案

任元青
2023-03-14

请参阅tcp客户端服务器示例。它使用TCP网关(请求/应答)。对于您的情况,您可能希望改用单向通道适配器

gateway(with void return) -> tcp-outbound-channel-adapter

tcp-inbound-channel-adapter -> service-activator

(其中服务激活器调用一个POJO,该POJO将入站消息保存在“缓冲区”中,该缓冲区可能由connectionId键控-从消息头获取)。

将service activator引用的网关和POJO注入控制器,以便(a)发送消息和(b)清空“缓冲区”。

您还可以侦听TcpConnectionEvents,以便检测连接是否丢失。

魏鸿禧
2023-03-14

您需要使用响应属性(ResponseEntity)。请参见此答案。tcp连接是双向连接,因此如果您的方法返回响应而不是void,它会自动将响应发送回发出请求的ip。您不必手动执行此操作。

 类似资料:
  • 我使用的是hazelcast v3。2.4客户-

  • 问题内容: 因此,已经有一个必须在控制台上运行的Python程序设置了。我将使用Javascript为应用程序构建Web GUI界面。我将如何: 一种。开始处理此Python程序的输入/输出,而无需触摸原始代码。 b。通过Javascript调用将控制台输入发送到Python程序。我已经研究了原始的HTTP请求/ AJAX,但不确定如何将其作为输入发送到Python程序。 问题答案: 一种。处理程

  • 当涉及到TCP时,Netty确实有很好的文档记录,但我想尝试一个简单的UDP服务器-客户机示例,但没有找到任何好的代码。(主要是邮件列表和据称有错误代码的用户) 有人愿意提供一些简单的例子吗?谢谢!

  • 我对客户端如何连接到其struct sockaddr_in设置为ADDRESS.sin_addr的服务器感到非常困惑。s_addr=htonl(INADDR_ANY); 绑定调用后,服务器监听套接字将被设置为INADDR_ANY,客户端将如何连接到设置为INADDR_ANY的套接字? 在connect()系统调用之前,客户端将传递到sockaddr_instruct的地址是什么?是服务器的ip地址

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题内容: 我尝试使用以下代码从服务器到客户端发送文件和目录列表。服务器正在从客户端接收消息,但我不知道服务器是否没有发送回结果或客户端是否不接受结果。 服务器端: 问题答案: 据我所见,您在客户端上做的同时在服务器上做。从服务器发送的字符串中没有行尾字符,因此客户端将永远无法完成。执行outqw.println()或添加到要发送的内容的末尾。话虽这么说,很难用一堆注释掉的东西来浏览未格式化的代码