2011-09-07 24 views
11

Tôi đã cân nhắc thực hiện một máy chủ trò chuyện bằng cách sử dụng node.js/socket.io. Tôi có nên biến nó thành máy chủ tcp hoặc máy chủ http không? Tôi tưởng tượng máy chủ tcp sẽ hiệu quả hơn, nhưng bạn có thể gửi những thứ khác cho nó như tập tin đính kèm không? Nếu tcp hiệu quả hơn, thì còn bao nhiêu nữa? Ngoài ra, chỉ cần tự hỏi có bao nhiêu kết nối đồng thời mà một máy chủ node.js có thể xử lý? Có nhiều công việc hơn để thực hiện TCP hay HTTP không?Thảo luận: Chat server qua node.js: HTTP hoặc TCP?

Trả lời

25

Bạn đang nói về 2 cách tiếp cận hoàn toàn khác nhau ở đây - TCP là giao thức tầng truyền tải và HTTP là giao thức lớp ứng dụng. HTTP (thường) hoạt động trên TCP, vì vậy tùy chọn nào bạn chọn, nó sẽ vẫn hoạt động trên TCP.

Câu hỏi hiệu quả là loại điểm tranh luận, bởi vì bạn đang nói về khác nhau OSI layers. Nếu bạn sử dụng ổ cắm TCP nguyên, giải pháp của bạn có thể hiệu quả hơn - ít nhất là băng thông - vì HTTP chứa toàn bộ dữ liệu phụ (tiêu đề) có khả năng không liên quan đến mục đích của bạn (tùy thuộc vào quy mô trò chuyện chương trình). Những gì bạn đang nói về phát triển có giao thức tầng ứng dụng của riêng bạn.

Bạn có thể gửi bất kỳ thứ gì bạn thích qua TCP - sau khi tất cả HTTP có thể gửi tệp đính kèm và hoạt động trên TCP. FTP cũng hoạt động trên TCP và được thiết kế hoàn toàn cho việc chuyển "tệp đính kèm". Để thực hiện điều này, bạn cần phải viết giao thức để có thể nói với bên từ xa rằng dữ liệu sau là một tệp, sau đó gửi dữ liệu tệp, sau đó thông báo cho bên từ xa rằng quá trình chuyển hoàn tất. Việc triển khai thực hiện điều này rất đa dạng và đa dạng (cách tiếp cận HTTP hoàn toàn khác với cách tiếp cận FTP) và các tùy chọn của bạn là vô hạn.

Tôi không biết chắc về giới hạn kết nối node.js, nhưng tôi có thể nói với một số lượng tin cậy hợp lý rằng hệ điều hành bị giới hạn. This có thể giúp bạn nắm bắt được câu trả lời cho câu hỏi đó.

Có thể gây tranh cãi cho dù đó là công việc nhiều hơn để làm điều đó với TCP hoặc HTTP - đó là rất nhiều công việc để làm điều đó trong cả hai. Tôi có lẽ sẽ nghiêng về phía tùy chọn TCP là đặt cược tốt nhất của bạn. Trong khi TCP yêu cầu bạn thiết kế giao thức thay vì/cũng như ứng dụng, HTTP không đặc biệt phù hợp với các ứng dụng trực tiếp, 2 chiều như máy chủ trò chuyện. Có nhiều triển khai trò chuyện qua HTTP sử dụng AJAX, nhưng tôi có thể cho bạn biết từ trải nghiệm đau đớn rằng họ là một nỗi đau hoàn toàn ở phía sau.

Tôi muốn nói rằng bạn chỉ nên xem HTTP nếu bạn dự định điểm cuối (tức là khách hàng) làm trình duyệt. Nếu bạn định viết một ứng dụng desktop cho điểm cuối, một liên kết TCP trực tiếp chắc chắn sẽ là con đường để đi. Lý do chính cho điều này là HTTP hoạt động theo cách thức phản hồi yêu cầu, trong đó máy khách gửi yêu cầu đến máy chủ và máy chủ phản hồi. Qua TCP, bạn có thể mở một luồng TCP duy nhất, có thể được sử dụng cho giao tiếp hai hướng. Điều này có nghĩa là máy chủ có thể đẩy một sự kiện đến máy khách ngay lập tức, trong khi qua HTTP, bạn phải đợi cho khách hàng gửi yêu cầu, vì vậy bạn có thể trả lời bằng một sự kiện. Nếu bạn định sử dụng một trình duyệt như là máy khách, nó sẽ làm cho toàn bộ việc chuyển tập tin trở nên phức tạp hơn nhiều (gửi ít nhất).

Có nhiều cách để thực hiện điều này qua HTTP sử dụng bỏ phiếu dài và đẩy máy chủ (read this) nhưng có thể là một nỗi đau thực sự để thực hiện.

Nếu bạn định thực hiện điều này trên mạng LAN (hoặc thậm chí qua internet), bạn nên xem xét UDP qua TCP - trong ứng dụng trò chuyện, thường không phải sứ mệnh quan trọng là thư đến đúng thứ tự và ngay cả khi nó được, người dùng có lẽ sẽ không thể gõ nhanh hơn so với các biến thể trong độ trễ mạng (có thể là < 100ms). Sau đó, để chuyển tập tin, bạn có thể thương lượng một ổ cắm TCP riêng biệt để trao đổi dữ liệu (như FTP), hoặc thực hiện một số loại hệ thống UDP ACK (như TFTP).

Tôi cảm thấy có nhiều điều để nói về chủ đề này nhưng ngay bây giờ tôi không thể diễn đạt thành lời - tôi có thể mở rộng câu trả lời này vào một lúc nào đó.

+0

bạn có biết cách làm tcp với phía máy khách node.js/socket.io không? Tôi cũng có câu hỏi này được liệt kê tại đây: http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io – Derek

+0

btw. cảm ơn vì đã giải thích rất nhiều. nó giúp ích rất nhiều. Tuy nhiên, bạn có thể giải thích thêm về udp và các ưu điểm/nhược điểm của nó trên tcp không? cám ơn rất nhiều! – Derek

+0

có mất gói tin udp ảnh hưởng đến ứng dụng trò chuyện không? – Derek

2

Máy chủ trò chuyện là chương trình Hello World trong nút. Sử dụng http.

Theo như câu hỏi về số lượng kết nối đồng thời mà nó có thể xử lý, tất cả phụ thuộc vào hệ thống của bạn. Thiết lập một máy chủ trò chuyện đơn giản và sau đó thử điểm chuẩn nó.

Ngoài ra, hãy kiểm tra http://search.npmjs.org/ và tìm kiếm chat cho một vài gợi ý.

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