2013-10-31 88 views
1

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

我hava遇到问题,当我写我的应用程序遵循示例。服务器反序列化字节流,然后回显服务,但客户端无法接收echo服务返回后的序列化的字节流。

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

(DE)serialize方法:

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

[DEBUG] com.snail.tcp.EchoService测试():回声服务:HELLOWORLD

[DEBUG] com.snail.tcp.CustomSerializerDeserializer序列化():开始连载:回声:HELLOWORLD

但是客户端无法接收反序列化消息 'HELLOWORLD',而不是一个SocketTimeoutException:读超时... 我想知道我做错了什么,thx很多

+0

你在这里问很多不同的问题,而不是提供很多细节。我建议你把它分解成单独的问题,并在每个问题中提供一些关于你迄今为止尝试过的内容,你想要做什么以及什么是错误的细节。 – SimonC

回答

3

该框架负责并发处理;如果你支持大量的客户,你通常只需要NIO;对于少数客户来说,通常不需要NIO。

您可以使用自定义(de)序列化器,也可以将变压器放置在入站端点的下游。

我建议您阅读Documentation,看看samples,如果您还有其他问题,请回复更具体的问题。

+0

感谢您的建议。请您找出上述问题。 –

+0

可能意味着序列化程序不会以客户期望的方式终止消息;你看到一个'logger.debug(“Message sent”+ message);'log ?.它应该出现在你的序列化器DEBUG消息之后。您的入站邮件具有结构,但您的出站只发送原始数据。客户不希望有某种结构吗?您可能需要运行Wireshark或类似的工具来查看发送的内容。 –

+0

我调试我的服务器。当它在serialize()方法中执行os.write(content)时,它引发java.nio.channels.ClosedChannelException.I只想返回一个简单的字符串,如“SUCCESS”给客户端,而不是一个结构。我可以在serialize()方法或其他地方认识到这一点吗? –