2015-02-17 2 views
1

Я хочу отправить файл, используя модуль интеграции tcp. Поэтому я сделал серверную часть, используя tcp-connection-factory.Как я могу проигнорировать сериализатор/десериализатор в интеграции весной?

<int-ip:tcp-connection-factory id="crLfServer" 
     type="server" 
     host="localhost" 
     port="7777" 
     single-use="true" 
     so-timeout="10000" 
     serializer="serializer" 
     deserializer="serializer" 
     /> 

<bean id="serializer" class="com.sds.redca.core.normalizer.CustomSerializerDeserializer" /> 

<int-ip:tcp-inbound-gateway id="gatewayCrLf" 
    connection-factory="crLfServer" 
    request-channel="toSA" 
    error-channel="errorChannel"/> 

Но, я сделал клиентскую сторону классом pojo в java, как и следующие.

import java.io.BufferedInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.Socket; 

public class SendClient { 
    public static void main(String[] args) { 
     String serverIp = "localhost"; 
     Socket socket = null; 

     try { 
      // 서버 연결 
      socket = new Socket(serverIp, 7777); 
      System.out.println("서버에 연결되었습니다."); 

      FileSender fs = new FileSender(socket); 
      fs.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class FileSender extends Thread { 
    Socket socket; 
    DataOutputStream dos; 
    FileInputStream fis; 
    BufferedInputStream bis; 

    public FileSender(Socket socket) { 
     this.socket = socket; 
     try { 
      dos = new DataOutputStream(socket.getOutputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void run() { 
     try { 
      String fName = "d:/test2/test.jpg"; 
      dos.writeUTF(fName); 

      File f = new File(fName); 
      fis = new FileInputStream(f); 
      bis = new BufferedInputStream(fis); 

      int len; 
      int size = 4096; 
      byte[] data = new byte[size]; 
      while ((len = bis.read(data)) != -1) { 
       dos.write(data, 0, len); 
      } 

      dos.flush(); 
      dos.close(); 
      bis.close(); 
      fis.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Наконец-то я получил ошибку, как и следующие.

CRLF not found before max message length: 2048 

Я думаю, что я должен игнорировать сериализатор/десериализатор для связи между двумя сторонами.

ответ

1

Поскольку вы не используете IP-адрес Spring Integration IP на стороне клиента, вам следует позаботиться о the end of message вручную.

С другой стороны выглядит так, как будто ваш CustomSerializerDeserializer является расширением ByteArrayCrLfSerializer, потому что сообщение CRLF not found before max message length: находится именно там.

Итак, первое: вы должны увеличить maxMessageSize для CustomSerializerDeserializer и второй - вы должны поставить \r\n байт в конце write на клиенте. Или просто используйте ByteArrayCrLfSerializer.serialize.

+0

Спасибо за ваш ответ. Это было здорово для меня. – verystrongjoe

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