2010-01-19 34 views
7

Tôi đang đọc và viết XML qua kết nối TCP (không phải HTTP) như là một phần của dịch vụ web mà tôi đang phát triển và tôi tự hỏi liệu có một cách nào đó "được lò xo" hay thậm chí là các ý tưởng khác không đang cố gắng dưới đây:Cách Spring sử dụng kết nối TCP là gì?

InputStream is = null; 
    OutputStream os = null; 
    Socket s = null; 
    try { 
     s = new Socket(address, portNo); 
     os = s.getOutputStream(); 
     os.write(msg.getBytes()); 
     os.flush(); 
     is = s.getInputStream(); 
     String xml = IOUtils.toString(is); 
     return xml; 
    } finally { 
     IOUtils.closeQuietly(os); 
     IOUtils.closeQuietly(is); 
     if (s != null) s.close(); 
    } 

Lưu ý, tôi đã không có quyền kiểm soát máy chủ, vì vậy tôi không nghĩ rằng tôi sẽ có thể sử dụng Spring remoting, nhưng đã tự hỏi liệu điều này có thể được cải thiện giống như JdbcTemplates của mùa xuân.

EDIT:

Lưu ý, chỉ cần làm rõ IOUtils là Apache commons-io ...

+0

Câu hỏi hay, nhưng không, Spring không cung cấp khung cho việc này. – skaffman

+0

Tôi đã suy nghĩ nhiều sau khi đào qua javadocs ... cảm ơn. – beny23

Trả lời

1

Hãy xem WebServiceTemplate. Đó là Spring trừu tượng chính cung cấp cho truy cập dịch vụ web phía máy khách. Mặc dù máy chủ của bạn không phải là một dịch vụ web điển hình, miễn là nó sử dụng cùng một mẫu yêu cầu phản hồi, bạn vẫn có thể sử dụng nó làm cơ sở cho giải pháp của mình. Lớp này cung cấp các móc cho mọi phần của giao tiếp (marshalling, gửi yêu cầu, nhận phản hồi, unmarshalling, vv). JavaDoc liệt kê tất cả các bước cần thiết để thực hiện các cuộc gọi dịch vụ web và bạn có thể ghi đè lên khá nhiều thứ ở đó. Vì vậy, ví dụ, bạn có thể sử dụng hỗ trợ marshalling tích hợp sẵn, nhưng ghi đè lên createConnection để tạo kết nối TCP tùy chỉnh của bạn.

+0

Đó là một cách thú vị về phía trước. Không chắc chắn 100% cho dù điều này sẽ không kết thúc là một giải pháp phức tạp hơn so với mã ở trên, nhưng nó trông giống như một tùy chọn. Cảm ơn. – beny23

+0

bạn có thành công với câu trả lời này không? –

+0

Tôi đã không đi xuống tuyến đường đó, nhưng chỉ cần viết giải pháp trừu tượng của riêng tôi. Về cơ bản, sử dụng một mẫu vận tốc để tạo XML yêu cầu và sử dụng JDOM để phân tích cú pháp phản hồi, với các "đầu nối" khác nhau để nói chuyện với các socket TCP (đồng bằng hoặc trên SSL), cân bằng tải/tự động thất bại, tất cả được nối với nhau qua mùa xuân. Làm việc một điều trị. – beny23

0

Hầu hết các Technologies mùa xuân được dựa trên cách tiếp cận tiêu chuẩn để làm việc. TCP/IP là cấp độ thấp hơn so với hầu hết các ứng dụng cần phải đối phó với ngày hôm nay. Tôi không thể nhớ lần cuối cùng tôi đã viết một dòng mã sử dụng thư viện Socket trực tiếp. Thay vào đó, những gì thường được thực hiện là xây dựng trên đầu trang của một giao thức cấp cao hơn.

Sử dụng HTTP hoặc RMI làm điểm bắt đầu sẽ tiết kiệm được nhiều rắc rối ở cấp độ ổ cắm. Có rất nhiều thư viện dịch vụ web tốt để trừu tượng hóa các chi tiết ổ cắm cách xa người dùng. Tôi khuyên bạn nên sử dụng JAX-WS. Spring có triển khai thực hiện JAX-WS trong dự án Spring-WS của họ. Apache CXF cũng cho phép cấu hình các dịch vụ web thông qua Spring.

RMI cũng là một tùy chọn. Từ xa của Spring tóm tắt giao thức RMI cách xa mã của bạn cho phép bạn tập trung vào chức năng. Nó không cung cấp cho bạn quyền truy cập vào các Ổ cắm nhưng đó có lẽ không phải là những gì bạn muốn làm anyway.

+0

Như tôi đã nói, tôi không có quyền kiểm soát phần máy chủ, vì tôi đang kết nối với một hệ thống kế thừa không sử dụng HTTP hoặc dịch vụ web hoặc RMI chỉ XML trên TCP (di sản rất thú vị ...) Có nói rằng đây là những gợi ý tốt cho trường hợp chung, nhưng không hoàn toàn áp dụng ở đây. – beny23

2

"Cách tiếp cận mùa xuân" áp dụng ở đây không phải cách bạn thực hiện giao tiếp socket TCP nhưng cách các lớp mà kết hợp với lớp này tương tác với nó. Vì vậy, tôi nghĩ rằng "phương pháp tiếp cận mùa xuân" sẽ ẩn bất kỳ loại giao tiếp socket sau một giao diện MessageSender (tên khủng khiếp, tôi biết) để các lớp cộng tác viên chỉ phải đối phó với một MessageSender và vẫn mù với thực tế rằng bất kỳ loại giao tiếp socket mức thấp nào đang diễn ra để đạt được việc gửi tin nhắn đó.

+0

"Cách tiếp cận" mà anh ta đề cập đến là mẫu được sử dụng bởi 'JdbcTemplate',' JndiTemplate', 'HibernateTemplate', v.v. Chúng không liên quan gì đến IoC và mọi thứ liên quan đến quản lý tài nguyên (ví dụ: xử lý luồng/phiên/kết nối). – skaffman

5

Tôi có một vấn đề tương tự và suy nghĩ của việc sử dụng tích hợp mùa xuân cho điều này, có vẻ như hoàn toàn phù hợp với tôi:

Lưu ý rằng mùa xuân Tích hợp 2.0 xây dựng trên đầu trang của Spring 3.0, trong khi phiên bản 1.0 trước đó cũng hỗ trợ Spring 2.x (nhưng không bao gồm Bộ điều hợp TCP/UDP).

Các vấn đề liên quan