2014-11-14 2 views
2

Так что после этого вопроса (how to plug a TCP-IP client server in a spring MVC application), Я смог успешно подключить шлюз к контроллеру REST Spring. Тем не менее, я смущен относительно того, куда идти дальше. Вот что я пытаюсь выполнить:Как настроить клиентскую и серверную модели Spring TCP?

1) Когда определенный маршрут получает запрос POST, откройте подключение к определенному IP-адресу (или работайте с соединением, которое уже открыто с этим IP-адресом), переданным из POST и отправить сообщение.

@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) Я также нужна моя весна бэкенд слушать 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(); 
    } 

} 

корня context.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> 

ReceiveTcp.java

@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; 
    } 
} 

Как я могу г решить эти проблемы?

ответ

1

Вам необходимо использовать ResponseEntity. См. Это answer. Соединение tcp - это двухстороннее соединение, поэтому, если ваш метод возвращает ответ вместо void, он автоматически отправляет его обратно в ip, который выдал вам запрос. Вам не нужно вручную это делать.

0

См. tcp-client-server sample. Он использует шлюзы TCP (запрос/ответ). Для вашей ситуации вы, скорее всего, захотите использовать односторонние адаптеры каналов.

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

и

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

(где активатор службы вызывает POJO, который сохраняет входящие сообщения в «буфере», вероятно, неправильно введенный с помощью ConnectionID - получаются из заголовка сообщения).

Внесите шлюз и POJO, на которые ссылается активатор службы, в ваш контроллер, чтобы вы могли (a) отправлять сообщения и (b) пустить «буфер».

Вы также можете слушать TcpConnectionEvents, чтобы вы могли обнаружить, что соединение потеряно.

+0

Hi @GaryRussell, еще раз спасибо за ваш ответ. Я очень новичок и в Spring, и в работе с TCP, поэтому извиняюсь за ошибки начинающего и стараюсь быть терпеливым со мной :). Я изменил свой вопрос и попытался выполнить то, что вы указали, - это выглядит правильно? Кроме того, отправка сообщения будет такой же простой, как вызов 'gw.send (« message »);'? Я просматривал документацию и видел, как люди посылают такую ​​информацию. – Tylerlee12

+0

Привет, Гэри, у меня вопрос о том, нужно ли нам отправлять пользовательский объект java, а не строку из простого шлюза somethiung like - send (obj), то что мы должны делать. Я попробовал ур пример, со строкой он работает, но пользовательский объект hava это не так. Не могли бы вы сообщить мне, какие изменения я должен внести. – RCS

+0

Лучше задавать новый вопрос, а не комментировать существующий. Вы не можете отправлять произвольные объекты Java через TCP.Если ваши объекты «Serializable», вы можете использовать [DefaultSerializer - см. Документацию] (http://docs.spring.io/spring-integration/reference/html/ip.html#connection-factories). Если нет, вам нужно преобразовать свои объекты в/из транспорта, например JSON. –

Смежные вопросы