2011-08-29 41 views
5

Xin lỗi vì câu hỏi mơ hồ, nhưng Trò chuyện có chính xác những gì tôi muốn cho trang web của mình. Đó là hệ thống trò chuyện trần. Bạn gửi và nhận tin nhắn ngay lập tức. Tôi đã dành ngày hôm nay tìm kiếm một phương pháp shoutbox, nhưng tất cả những gì tôi có thể tìm thấy là những người nói rằng sử dụng khoảng thời gian MySQL và javascript để tiếp tục kiểm tra. Chat cập nhật ngay lập tức với tin nhắn mới. Tất cả hoạt động như thế nào?Trò chuyện hoạt động như thế nào?

+3

Hệ thống trò chuyện hiệu quả giữ kết nối nơi máy chủ thông báo cho khách hàng về các thư mới trái ngược với phương pháp cho phép khách hàng hỏi các câu hỏi mới mỗi ms vì không có kết nối. – Nobody

+0

Làm cách nào để thực hiện điều đó? – mowwwalker

+1

Hầu hết có thể nó được thực hiện với một cái gì đó như descrivbed trong ['Streaming' chương của Comets trang] (http://en.wikipedia.org/wiki/Comet_ (lập trình)). Có chắc chắn thư viện của bên thứ ba triển khai Comets trong PHP, hãy thử googling nó. – J0HN

Trả lời

11

Bạn nên đọc số này wikipedia article, nó sẽ giúp bạn hiểu rõ hơn về quy trình.

Từ khóa chính ở đây là bỏ phiếu dài, ổ cắm web, ổ cắm flash.

Ngoài ra, đây là (một trong những nơi), nơi node.js + socket.io tỏa sáng.

4

Đó là một miếng bánh. Tất cả bạn cần là máy chủ mà bạn có thể viết trong một vài phút (trong C#, không chắc chắn về PHP). Máy chủ phải chấp nhận yêu cầu HTTP GET, như thế này ví dụ:

GET /chat?room=someroom&me=Jerod HTTP/1.1

và giữ kết nối của nó mở (chỉ chấp nhận TcpClient đối tượng và đau nó dưới một số từ điển ví dụ Dictionaty<string, Dictionary<string, TcpClient>> clients; như thế này: clients["someroom"].Add("Jerod", tcpClient); và giữ nó cho đến khi có dữ liệu để gửi trở lại Jerod)

Và nó nên chấp nhận POST, nắm giữ văn bản người dùng đang cố gắng để gửi đến những người dùng khác trong phòng:

POST /chat?room=someroom&me=Sara HTTP/1.1 
Content-Length: 2 

Hi 

Khi máy chủ nhận được điều này, nó biết rằng Sara đang gửi "Hi" cho tất cả người dùng trong phòng "someroom". Kể từ Jerod của, GET không bao giờ có trả lời, kết nối vẫn còn mở, và tất cả các máy chủ phải làm là nhận được rằng kết nối từ một cuốn từ điển (hoặc một số cấu trúc dữ liệu khác) và đáp ứng với:

HTTP 200 OK 
Content-Length: <length> 

Sara: Hi 

Và, trên client side, bạn sẽ có một đối tượng GET XMLHttpRequest (AJAX với phương thức GET) sẽ có khoảng thời gian chờ là 0 (chặn đến vô cùng) và nó sẽ được sử dụng để mở kết nối tới máy chủ mà qua đó nó sẽ chuyển tiếp nội dung mà người khác đang gửi.

Và bạn cần thêm một POST XMLHttpRequest mà bạn sẽ sử dụng để gửi dữ liệu cho các ứng dụng khách khác.

Khi AJAX (GET) đầu tiên thành công, bạn viết TEXT mà nó giữ (nó là "Sara: Hi") cho một số DIV và thực hiện lại yêu cầu GET để máy chủ có thể cho người dùng biết khi có ai đó khác đã đăng tải sau khi Sara ...

Khi thứ hai AJAX (POST) thành công, bạn viết thư cho div gì bao giờ người dùng đã nhập được gửi đi, prepended với tên truy nhập, như vậy trong JS: document.getElementById("chat").innerHTML += uname+": "+txt;

của nó khá thẳng về phía trước và đơn giản.

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